Memo

メモ > サーバ > 構築: 基本設定

■概要
サーバの基本設定に関するメモ Webサーバとしての設定などは別のメモを参照
■OSについて
■OSのバージョン メモは基本的にCentOS7での検証内容となっている CentOS6環境での操作内容となっているものがあるが、徐々にCentOS7での操作に置き換えている またAWSのAmazonLinuxはCentOS6が、AmazonLinux2はCentOS7がベースとなっているため、基本的には同じ手順で作業できる ■CentOS6 CentOS6は2020年11月にサポートが終了される CentOS 6のサポート期間終了に関する注意喚起 https://cybersecurity-tokyo.jp/security/cyberthreat/259/index.html ■CentOS7 CentOS6は2024年6月にサポートが終了される CentOS8終了とCentOS Streamへの移行で何が起こるの? 後継OS候補も紹介 | ベアケアブログ https://barecare.jp/blog/2021/06/29/42/ ■CentOS8・CentOS Stream・AlmaLinux CentOS8が2019年9月にリリースされるので、今後移行していくと思われる CentOS 8 と CentOS 7 の違い、yum やミドルウェアにも要注意 - サーバー構築と設定 〜初心者にも分かりやすく解説〜 https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=3991 CentOS8 サーバー構築(インストール) - Qiita https://qiita.com/sigenyan/items/f47e460e154d604b2a33 CentOS8 (Minimum) インストールしてとんでもなかったこと一覧 - NorthPage https://north.thco.mp/2019/09/26/centos8-minimum/ …と思いきや、CentOS8は2021年に開発が終了されることになった CentOSは「CentOS Stream」へとシフトしていくらしい 急いでCentOS8へ移行せずに、2024年まではCentOS7をメインで使うのが無難か CentOS Streamへのシフトでうろたえないための手引き https://zenn.dev/koduki/articles/26eb2df8109a39 CentOS Stream入門 - 赤帽エンジニアブログ https://rheb.hatenablog.com/entry/centos-stream-intro なおCentOS Streamは、Windows10やMacOSXのように明確なバージョンが無く、原則最新版が自動的に当たり続ける方式 CentOS8からCentOS Streamへの移行は難しくないらしいが、それでもアプリケーションの全機能のテストは発生する CentOS Linux 8 から CentOS Stream 8 への移行はいと簡単です | CyberAgent Developers Blog https://developers.cyberagent.co.jp/blog/archives/28180/ 上記のとおり CentOS Stream は安定的な固定リリース方式ではなく、 ローリングリリース(断続的に、頻繁に更新していく方式)が採用されるため、安定性の面で多くのユーザは反感を募らせている こうした状況を受け、CloudLinuxは「Lenix」プロジェクトを立ち上げ「AlmaLinux」という新たな新OSをリリースした CentOSの移行先の有力候補となっている アップデートにyumではなくdnfを使うなど、CentOS7ではなくCentOS8がベースになっている CentOS終了へ――移行先として注目の「Alma Linux」「Rocky Linux」を試してみよう:インストール手順を紹介 - @IT https://atmarkit.itmedia.co.jp/ait/articles/2110/07/news006.html CloudLinux、「CentOS」の代替OSは「AlmaLinux」--今四半期リリースへ - ZDNet Japan https://japan.zdnet.com/amp/article/35165158/ AlmaLinux とは?CentOS Linux 8の代替候補『AlmaLinux』をご紹介! https://academy.gmocloud.com/qa/20210414/11235 CentOS 8の移行を考える - Qiita https://qiita.com/yamada-hakase/items/2e015d9b09be97724ab0 以下にAlmaLinuxの検証記事がある CentOSの後継「AlmaLinux」を試してみた - arms inc. Engineers' Blog https://tech.arms-soft.co.jp/entry/2023/01/25/090000 AlmaLinuxを使ってみた(前編) - Qiita https://qiita.com/yamada-hakase/items/245da3df19e9334d041c
■SSHで接続
■SSHとは SSHとは「Secure Shell」の略で、ネットワークに接続された機器を遠隔操作し、管理するための手段 専用のソフトを使用して接続し、コマンドでサーバを操作する SSHとは?仕組みとSSHサーバーの設定をわかりやすく解説します! - カゴヤのサーバー研究室 https://www.kagoya.jp/howto/it-glossary/server/ssh/ ■Poderosaでの接続 Poderosa や Tera Term が有名 ここではPoderosaをもとに設定方法を記載する Poderosa Terminal - プロフェッショナルのためのSSHクライアント http://ja.poderosa-terminal.com/ Poderosa 日本語情報トップページ - OSDN https://ja.osdn.net/projects/sfnet_poderosa/ Tera Term (テラターム) プロジェクト日本語トップページ - OSDN https://ja.osdn.net/projects/ttssh2/ 「ファイル → 新規Telnet/SSH接続」から接続できる 以下は接続設定の例 ・「ホスト」に接続先を設定 ・「プロトコル」は基本的に「SSH2」を選択 ・「ポート」は基本的に「22」だが、変更されていることも多い ・SSHパラメータの「アカウント」と「パスフレーズ」を入力して認証。公開鍵で認証することも多い ・ターミナルの「種類」は「xterm」を選択 最初に「ツール → オプション」から以下の設定を行っておくといい ・表示 → 色指定エスケープシーケンスの設定 → 「7」の文字色を黒に ・ターミナル → 英数字に追加する単語構成文字 → 「.:-/」を入力 ・操作 → 右クリックの動作 → 「貼り付け」を選択し、「マウスで選択したら自動的にコピー」をチェック WindowsからSSHサーバーへリモート接続(Poderosaパスワード方式ログイン編) - Fedoraで自宅サーバー構築 https://fedorasrv.com/poderosa-private.shtml 好みによるが、「色指定エスケープシーケンスの設定」の参考に PoderosaでSolarized風の色指定エスケープシーケンスの設定 - noob http://nrok81.hatenablog.com/entry/2013/04/23/230000 Solarized https://ethanschoonover.com/solarized/ 以下、上記ページから転載
項目 色(RGB) 色(16進) 背景 RGB(0,43,54) #002b36 標準 RGB(131,148,150) #839496 0 デフォルト デフォルト 1 RGB(220,50,47) #dc322f 2 RGB(133,153,0) #859900 3 RGB(188,137,0) #b58900 4 RGB(38,139,210) #268bd2 5 RGB(211,54,130) #d33682 6 RGB(42,161,152) #2aa198 7 デフォルト デフォルト キャレット RGB(131,148,150) #839496
なお、Poderosaはバージョン4まではオープンソースだったが、バージョン5からは有償となっている(ただし無期限に試用できる) 自分では無料版の Poderosa 4.3.16 を使い続けている ■RLoginでの接続 Poderosaに代わってRLoginを試しているのでメモ rlogin/telnet/ssh(クライアント)ターミナルソフト https://kmiya-culti.github.io/RLogin/ 以下のページの「Windows 7以降、実行プログラム(64bit) rlogin_x64.zip」から https://github.com/kmiya-culti/RLogin/releases/ 「1.3 インストールおよびアンインストール」にある「実行プログラム(64bit)」からZIPファイルをダウンロード 展開すると作成される RLogin.exe を以下に配置 C:\Program Files\RLogin\RLogin.exe 実行すると「Server Select」という画面が表示されるので、接続先を設定する 「サーバー → ホスト設定」さえ設定すれば、最低限使えるみたい 引き続き、画面表示など確認したい RLoginでデフォルト設定を作成する - かべぎわブログ https://www.kabegiwablog.com/entry/2019/03/06/140000 「サーバー」以外の設定を共通にする方法 「サーバー → ホスト設定 → その他オプションを継承」にチェックを入れ、継承したい大元の設定を選択 これで他のページの設定を変更しようとしても「変更できません」と表示される 接続情報をカラにした設定を「_default」として最初に作っておくのがいいか ただしこの場合、「本番環境だけ色を変える」のような設定ができないような? また「RSA2認証鍵の署名方式」もすべてが「SHA1」になるような? 引き続き確認したい 2.4 サーバーの選択・設定 https://kmiya-culti.github.io/RLogin/#SERVERSEL 「サーバー」画面で接続先を設定するとき、画面右上の「タブ(上)」に例えば 「xxx」と入力すると、サーバ一覧画面でタブで分類して表示される さらに「xxx\yyy」と「\」で区切って入力すると、サーバ一覧画面の左にツリーによる分類が表示される さらに「xxx\yyy\zzz」と「\」で区切って入力すると、ツリーによる階層が深くなっていく sshクライアントRLoginで円記号問題の解決方法 - Qiita https://qiita.com/Michiyuki/items/422136993d9b9afafba8 「フォント → 文字セット」を「UTF-8」に変更し、その上で上記ページの操作を行った さらに「フォント → フォントセット → デフォルト」を「MSゴシック」から「Courier New」に変更した Rlogin(ターミナルソフト)のフォントサイズを変更するオプションの場所 - Qiita https://qiita.com/haya2_/items/c50028594bff118e82b6 「スクリーン → フォントサイズから一行あたりの文字数を決定」で「20(15.00)」から「16(12.00)」に変更した さらに「スクリーン左右の余白設定」をそれぞれ「0」から「4」に変更した RLogin 端末の16色カラーがキモいのを直す方法 - 余白の書きなぐり https://auewe.hatenablog.com/entry/2014/05/30/042151 Poderosaの設定を参考に色を変更中 「カラー → 16色カラーテーブル」で 上段の左から1番目を「0,43,54」に変更(背景色になる) 上段の左から8番目を「131,148,150」に変更(文字色になる) 下段の左から2番目を「220,50,47」に変更 下段の左から3番目を「133,153,0」に変更 下段の左から4番目を「188,137,0」に変更 下段の左から5番目を「38,139,210」に変更 下段の左から6番目を「211,54,130」に変更 下段の左から7番目を「42,161,152」に変更 下段の左から8番目を「200,200,200」に変更 ただし背景色(上段の左から1番目の色)を上記のようにすると、カーソルが勝手にピンク色になってしまう 修正できるか 「スクリーン → 文字カーソルの形状(DECSCUSR)と色を設定」で色を指定できるが、思ったような色にならない。ひとまず「128,128,128」と設定した 「スクリーン → IMEオンで文字カーソルの色と形を変更する」にチェックを入れた Rloginで接続先を間違えないために背景色を変えるぞい https://penpen-dev.com/blog/rlogin-iro/ 本番環境だけ別の色に…というのは有効そう ただし普段から本番環境での操作が多いので、奇抜な色にしても操作しづらいかもしれない RLoginでやっておきたい設定、Tips - Qiita https://qiita.com/g-iki/items/5d15247b9154bf2e3b17 背景色ではなく、「接続先情報を画面背景に表示」の機能で本番環境や検収環境の文字を表示するのはいいかもしれない EC2(Amazon Linux 2022)にターミナルソフトからSSH接続できない場合の対処方法 | DevelopersIO https://dev.classmethod.jp/articles/tsnote-ec2-rsa-sha-001/ 接続しようとすると「You may need to change the ssh-rsa key sign algorithm SHA1 to SHA2-256/512」のエラーになる 古いAmazonLinux1への接続で発生「サーバー → プロトコル → SSH」で「RSA2認証鍵の署名方式(openssh-7.2以前はSHA1のみ)」を「SHA1」にすると接続できる 以下も参考になりそう PuttyからRLoginに乗り換えたので設定をメモ | 純規の暇人趣味ブログ https://jyn.jp/rlogin-settings/ RLogin 設定のすゝめ - Qiita https://qiita.com/Richter-A/items/d53e9ab1ac48080532da ■xterm と kterm xterm - Wikipedia https://ja.wikipedia.org/wiki/Xterm X Window Systemの標準的なターミナルエミュレータ kterm - Wikipedia https://ja.wikipedia.org/wiki/Kterm xtermからの派生ターミナルエミュレータの1つであり、多言語の表示をサポートしている xtermでは日本語を表示できなかったらしいが、それは昔の話かも?Poderosaで試すと問題なく表示された また、Poderosaでktermを試すと ・topコマンドが使えない(何故か「top -b -d 1 -n 5」のようにすれば使える) ・lessコマンドが使えない ・vimでの色分けもされない といった問題が発生したので、特別な理由がなければxtermを使う方が良さそう 派生版ターミナルよりも標準ターミナルのほうが正しく操作できる…ということなのかも ■補足 $ からはじまるコマンドは、一般ユーザによる入力を表している # からはじまるコマンドは、rootユーザによる入力を表している vi を使っている箇所は vim でも問題ない また、大抵の環境では vi を実行すると vim が呼び出される 以降のサーバ設定手順は、以下も参考になる http://centossrv.com/ http://nekopunch.hatenablog.com/entry/2015/01/16/112402 http://qiita.com/shojimotio/items/79264678e9ea10b6fd19
■rootになる
以下などのコマンドでrootに昇格できる(サーバによって異なる可能性があるので、都度確認する) 昇格については Command.txt の内容も参考にする
$ sudo su -
■言語を設定
※コンソールの表示を日本語にする 初期状態では大抵英語になっている
# localedef -f UTF-8 -i ja_JP ja_JP … ロケールを追加(環境によっては追加済みなので不要) # localectl set-locale LANG=ja_JP.UTF-8 … 設定 # localectl status … 確認
設定は次回ログイン時に有効になるので、一旦ログアウトして確認する ■CentOS6の場合
# vi /etc/sysconfig/i18n … 言語を設定
#LANG="C" LANG=ja_JP.UTF-8 … 日本語を指定
設定は次回ログイン時に有効になるので、一旦ログアウトして確認する
■タイムゾーンを設定
※タイムゾーンが日本時間になっていない場合に設定する(AWSのEC2など) Amazon EC2のタイムゾーンを日本時間に変更する方法 http://qiita.com/drapon/items/2fc5b21a9cdc31ddb152 EC2のタイムゾーンがyum updateで変わる? http://blog.shuffleee.com/2265/
# date … タイムゾーンを確認 2015年 3月 8日 日曜日 14:19:26 UTC … JSTになっていない場合に以下を設定 # timedatectl set-timezone Asia/Tokyo … 設定 # timedatectl status … 確認
再度dateを実行し、日本時間になっていることを確認する(反映されなければ、システムを再起動してみる) ■CentOS6の場合
# ls /usr/share/zoneinfo/ … インスタンスで使用する時間帯を検索(Japanがあることを確認する) # vi /etc/sysconfig/clock … clockファイルを編集
#ZONE="UTC" ZONE="Japan" … Japanに設定 UTC=true
# ln -sf /usr/share/zoneinfo/Japan /etc/localtime … 時間帯ファイルにシンボリックリンク
■ファイヤーウォールを設定
※不要なアクセスを遮断する 諸々の初期設定を行っている最中に侵入される可能性があるので、早い段階で設定する ※新規の接続が対象で、確立済みの接続には影響しない ※AWSではセキュリティーグループを使用するので以下の手順は原則不要 ■概要 CentOS7では、iptablesではなくfirewalldコマンドで設定する 内部的にはiptablesが使われているが、共存はできない コマンドで操作してXMLに記録されるのが基本的な操作方法 典型的な設定のテンプレートとして「ゾーン」が用意されている publicはパブリックエリア用、internalは内部ネットワーク用、など 公開サーバならpublicを使用すればいい ループバックの指定、ESTABLISHED,RELATEDの指定、ICMPの指定といった、 基本的な機能は指定しなくても有効になっている 【丁寧解説】Linuxのファイアウォール firewalld の使い方 https://eng-entrance.com/linux-centos-firewall firewall-cmd ... コマンド。これに続けて様々な指定を行う --permanent ... 恒久的な設定を行う。反映には「firewall-cmd --reload」が必要。省略すると即時反映だが、再起動とともに消える --zone=public ... 操作対象のゾーン。省略すると、デフォルトのpublicゾーンが対象になる 以下にサービスやゾーンの初期設定の定義ファイルがある /usr/lib/firewalld/services /usr/lib/firewalld/zones 以下にユーザによってカスタマイズされた定義ファイルがある /etc/firewalld/services /etc/firewalld/zones 以下にダイレクトルールの定義ファイルがある /etc/firewalld/direct.xml 以下にfirewallの設定ファイルがある /etc/firewalld/firewalld.conf
# firewall-cmd --list-all … firewalldの設定内容を確認 public (active) … publicゾーンが設定されている target: default icmp-block-inversion: no interfaces: eth0 … eth0が対象になっている sources: services: ssh dhcpv6-client … SSH(22番ポート)のみ空いている ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: # firewall-cmd --direct --get-all-rules … ダイレクトルールを確認
CentOS7でのFirewalld設定(ほぼコマンド例) - Qiita https://qiita.com/t-morisoba/items/d8702015f92a0dcb7280 CentOS 7 firewalld よく使うコマンド - Qiita https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e firewallは、ポートによる制限やIPアドレスによる制限など、手段が複数用意されている ポートによる制限: 特定のポートへのアクセスを許可する 例えば「firewall-cmd --permanent --add-port=10022/tcp」とすると、10022番ポートへのすべてのアクセスが許可される 例えば「firewall-cmd --permanent --add-port=8080/tcp」とすると、8080番ポートへのすべてのアクセスが許可される 基本的には、後述の「サービスによる制限」を利用する方が後から判別しやすい 設定された内容は、「firewall-cmd --list-all」で確認したとき「ports」に反映される サービスによる制限: サービス名を指定してアクセスを許可する 例えば「firewall-cmd --permanent --add-service=http」とすると、HTTPへのすべてのアクセスが許可される 例えば「firewall-cmd --permanent --add-service=https」とすると、HTTPSへのすべてのアクセスが許可される どのサービスがどのポートを使用するかは、 /usr/lib/firewalld/services/ssh.xml などのファイルに記録されている これを /etc/firewalld/services/ssh.xml などに複製してポート番号を変更することで、例えば「SSHのポートは22ではなく10022」のような制御ができる (詳細は、後述の「SSHのポート番号変更」も参照) 設定された内容は、「firewall-cmd --list-all」で確認したとき「services」に反映される IPアドレスによる制限: IPアドレスを指定してアクセスを許可する 例えば「firewall-cmd --permanent --add-source=203.0.113.1/32」とすると、203.0.113.1からのすべてのアクセスが許可される 設定された内容は、「firewall-cmd --list-all」で確認したとき「sources」に反映される リッチルールによる制限: 例えば「firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=203.0.113.1/32 service name=ssh accept'」とすると、 SSH(デフォルトは22番ポート)へのアクセスを203.0.113.1からのアクセスに限定して許可される 設定された内容は、「firewall-cmd --list-all」で確認したとき「rich rules」に反映される SSHやFTPなどにIP制限を設けたい場合、原則このリッチルールでの指定となる 例えば「firewall-cmd --permanent --add-service=ftp」とした場合、 別途リッチルールによるIPアドレス別の許可を行なっても、FTPへのアクセスは全開放済みになっているので注意 いずれにせよ、設定を行ったら 「意図したアクセスを許可しているか」「意図しないアクセスが許可されていないか」 を都度確認するのが確実 ■起動
# firewall-cmd --list-all … firewallのコマンドを使用 FirewallD is not running … 起動していない # systemctl status firewalld … firewallの状態を確認 ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) … 起動していない Docs: man:firewalld(1) # systemctl start firewalld … ファイヤーウォールを起動(起動していない場合) # systemctl enable firewalld … ファイヤーウォールを自動起動(自動起動になっていない場合)
■設定方法 80番、443番、10022番ポートを開ける場合
# firewall-cmd --permanent --add-service=http # firewall-cmd --permanent --add-service=https # firewall-cmd --permanent --add-port=10022/tcp … 推奨されない方法かも。詳細は後述の「SSHのポート番号変更」を参照 # firewall-cmd --list-all … firewalldの設定内容を確認 public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: ssh dhcpv6-client http https … HTTPとHTTSのポートが空いた ports: 10022/tcp … 10022番ポートが空いた protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
設定をリセットする場合(一般的な方法かどうかは不明)
# cp /usr/lib/firewalld/zones/public.xml /etc/firewalld/zones/public.xml # firewall-cmd --reload
設定例
# firewall-cmd --permanent --add-service=http … 80番ポートへのアクセスを許可 # firewall-cmd --permanent --add-service=https … 443番ポートへのアクセスを許可 # firewall-cmd --permanent --add-port=22/tcp … 22番ポートへのアクセスを許可 # firewall-cmd --permanent --add-port=10022/tcp … 10022番ポートへのアクセスを許可 # firewall-cmd --permanent --add-source=203.0.113.1/32 … 203.0.113.1からのアクセスを許可 # firewall-cmd --permanent --add-source=203.0.113.0/24 … 203.0.113.0/24の範囲からのアクセスを許可 # firewall-cmd --permanent --set-log-denied all … アクセスを拒否したらログに記録 # firewall-cmd --permanent --remove-service=https … 443番ポートへのアクセス許可を削除する場合 # firewall-cmd --permanent --remove-port=10022/tcp … 10022番ポートへのアクセスを許可を削除する場合 # firewall-cmd --permanent --remove-source=203.0.113.1/32 … 203.0.113.1からのアクセスを許可 # firewall-cmd --permanent --add-service=ftp … 21番ポートへのアクセスを許可する場合 # firewall-cmd --permanent --add-port=60000-60030/tcp … 60000〜60030番ポートへのアクセスを許可する場合 # firewall-cmd --permanent --remove-port=60000-60030/tcp … 60000〜60030番ポートへのアクセス許可を削除する場合 # firewall-cmd --permanent --add-rich-rule='リッチルール' … より複雑なルール(リッチルール)を設定 # firewall-cmd --permanent --list-rich-rules … 設定されているリッチルールの確認(ルールの削除時などに使用できる) # firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=203.0.113.1/32 service name=http accept' # firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address=203.0.113.1/32 service name=http accept' … 特定IPから特定サービスへのアクセスを許可&削除例 # firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=203.0.113.1/32 service name=http accept' # firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address=203.0.113.1/32 service name=http accept' … 特定IPから特定ポートへのアクセスを許可&削除例
リッチルールの削除は、「firewall-cmd --permanent --list-rich-rules」で設定されているルールを確認し、削除したいルールをコピーして 「firewall-dmc --permanent --remove-rich-rule='(ここにコピーしたものを貼り付け)'」 とすることで削除できる CentOS7でのFirewalld設定(ほぼコマンド例) - Qiita https://qiita.com/t-morisoba/items/d8702015f92a0dcb7280
# firewall-cmd --reload … firewalldの設定を再読込 # systemctl restart firewalld … firewalldを再起動 # firewall-cmd --list-all-zones … firewalldの設定内容を確認(すべてのゾーン) # firewall-cmd --list-all … firewalldの設定内容を確認(デフォルトゾーン) # firewall-cmd --list-all --zone=public … firewalldの設定内容を確認(特定のゾーン / この場合は「public」ゾーン) # firewall-cmd --get-default-zone … デフォルトで使用されるゾーン # firewall-cmd --set-default-zone=block … デフォルトで使用されるゾーンを変更する場合 # firewall-cmd --get-active-zones … アクティブになっているゾーン(何も返されなければ、デフォルトの「public」が割り当てられている) # firewall-cmd --get-services … 設定時に使用できるサービス一覧 # ll /usr/lib/firewalld/services … 直接確認する場合 # firewall-cmd --state … 動作状況を確認
CentOS7でfirewalld(ファイアウォール)の設定。firewall-cmd -list-allでports(ポート番号)の指定をお忘れなく! - エコテキブログ https://e-yota.com/webservice/post-2563/
# iptables-save … すべての設定内容を確認
CentOS7のfirewalldをまじめに使うはじめの一歩(systemdも少し) - Qiita https://qiita.com/shrkw/items/8410e9cb65eb789a40e1 firewalld初心者のメモ - Qiita https://qiita.com/T_Shinaji/items/b3ba400feb3c6adebd27 CentOS7でのFirewalld設定(ほぼコマンド例) - Qiita https://qiita.com/t-morisoba/items/d8702015f92a0dcb7280 CentOS 7 firewalld よく使うコマンド - Qiita https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e CentOS7 ダイレクトルールを使ったFirewallの強化(iptables) http://www.yam-web.net/centos7/direct-rule/index.html firewalldでソースを指定して通信を遮断する方法 | server-memo.net http://www.server-memo.net/centos-settings/firewalld/source-drop.html 自分なりにあちこちからかき集めて作ったセキュアなCentOS7サーバ - Qiita https://qiita.com/KurokoSin/items/51e79657f1f2104cf607 firewall-cmdコマンドの使い方 - Qiita https://qiita.com/hana_shin/items/bd9ba363ba06882e1fab ■SSHのポート番号変更 SSHのポートを変更している場合、 「--add-port=10022/tcp」と指定する…よりも、以下のようにサービスのポート番号を変える方が良さそう
# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh.xml # vi /etc/firewalld/services/ssh.xml
<?xml version="1.0" encoding="utf-8"?> <service> <short>SSH</short> <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description> <port protocol="tcp" port="22"/> … SSHのポート番号に合わせて変更 </service>
CentOS7でSSHのポート番号を変更する - Qiita https://qiita.com/fk_2000/items/019b62818e34be973227 ■設定例 以下に設定すべき内容の一例をまとめ中
# systemctl start firewalld … ファイヤーウォールを起動(起動していない場合) # systemctl enable firewalld … ファイヤーウォールを自動起動(自動起動になっていない場合) # cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh.xml # vi /etc/firewalld/services/ssh.xml … 必要に応じて、SSHのポート番号を変更する # firewall-cmd --list-all … firewalldの設定内容を確認 # firewall-cmd --get-default-zone … デフォルトで使用されるゾーンを確認(必要に応じて) # firewall-cmd --set-default-zone=public … デフォルトで使用されるゾーンを変更(必要に応じて) # firewall-cmd --permanent --remove-service=ssh … 通常のSSHポートを塞ぐ(特定IPからの接続のみ許可する場合) # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 10.0.0.0/8 -j DROP # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 172.16.0.0/12 -j DROP # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 192.168.0.0/16 -j DROP … プライベートアドレスを拒否 # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 127.0.0.0/8 -j DROP # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 169.254.0.0/12 -j DROP # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 192.0.2.0/24 -j DROP # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 198.51.100.0/24 -j DROP # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 203.0.113.0/24 -j DROP # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 224.0.0.0/4 -j DROP # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 240.0.0.0/5 -j DROP … ローカルアドレスや例示用アドレスなどを拒否 # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 0.0.0.0/8 -j DROP # firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -i eth0 -s 255.255.255.255 -j DROP … デフォルトルートとブロードキャストアドレスを拒否 # firewall-cmd --permanent --direct --add-chain ipv4 filter LOG_PINGDEATH # firewall-cmd --permanent --direct --add-rule ipv4 filter LOG_PINGDEATH 0 -m limit --limit 1/sec --limit-burst 4 -j ACCEPT # firewall-cmd --permanent --direct --add-rule ipv4 filter LOG_PINGDEATH 0 -j LOG --log-prefix "[FIREWALL PINGDEATH]: " # firewall-cmd --permanent --direct --add-rule ipv4 filter LOG_PINGDEATH 0 -j DROP … Ping of Death 攻撃対策(1秒間に4回を超えるpingはログを記録して破棄) # firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=203.0.113.1/32 service name=ssh accept' … 特定IPからSSHへのアクセスを許可(必要に応じて) # firewall-cmd --permanent --add-service=http … HTTPへのアクセスを許可 # firewall-cmd --permanent --add-service=https … HTTPSへのアクセスを許可 # firewall-cmd --set-log-denied all … アクセスを拒否したらログに記録 # firewall-cmd --reload … firewalldの設定を再読込
※22番ポートが閉じられているかは要確認 ■CentOS6の場合 さくらのVPS を使いはじめる 3 - iptables を設定する http://akabeko.me/blog/2010/09/%E3%81%95%E3%81%8F%E3%82%89%E3%81%AEvps-%E3%82%92%E4%BD%BF%E3%81%84%E... iptablesの設定 http://www.nina.jp/server/redhat/iptables/iptables.html ファイアウォール構築(iptables) http://centossrv.com/iptables.shtml 【丁寧解説】Linuxファイアウォール iptablesの使い方 https://eng-entrance.com/linux-firewall
# yum list installed | grep iptables … iptablesがインストールされていることを確認 iptables.x86_64 1.3.5-5.3.el5_4.1 installed … インストールされている iptables-ipv6.x86_64 1.3.5-5.3.el5_4.1 installed # iptables -L … iptablesの設定を確認 Chain INPUT (policy ACCEPT) … 何も設定されていない target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
以下、ファイヤーウォールを設定
# vi /etc/sysconfig/iptables … ファイヤーウォールを設定
############################## #テーブル ############################## #パケットフィルタリングではfilterテーブルを使用 *filter ############################## #デフォルトポリシー ############################## #受信はすべて破棄 :INPUT DROP [0:0] #経由はすべて破棄 :FORWARD DROP [0:0] #送信はすべて許可 :OUTPUT ACCEPT [0:0] #Ping of Death 攻撃対策 :LOG_PINGDEATH - [0:0] #プライベートアドレスを拒否 -A INPUT -s 10.0.0.0/8 -j DROP -A INPUT -s 172.16.0.0/12 -j DROP -A INPUT -s 192.168.0.0/16 -j DROP #ローカルアドレスや例示用アドレスなどを拒否 -A INPUT -s 127.0.0.0/8 -j DROP -A INPUT -s 169.254.0.0/12 -j DROP -A INPUT -s 192.0.2.0/24 -j DROP -A INPUT -s 198.51.100.0/24 -j DROP -A INPUT -s 203.0.113.0/24 -j DROP -A INPUT -s 224.0.0.0/4 -j DROP -A INPUT -s 240.0.0.0/5 -j DROP #デフォルトルートとブロードキャストアドレスを拒否 -A INPUT -d 0.0.0.0/8 -j DROP -A INPUT -d 255.255.255.255 -j DROP #Ping of Death 攻撃対策(1秒間に4回を超えるpingはログを記録して破棄) -A LOG_PINGDEATH -m limit --limit 1/sec --limit-burst 4 -j ACCEPT -A LOG_PINGDEATH -j LOG --log-prefix "[IPTABLES PINGDEATH]: " -A LOG_PINGDEATH -j DROP ############################## #ユーザ定義ポリシー ############################## #ユーザ定義チェーン :MY-FIREWALL - [0:0] #よく見かける RH-Firewall-1-INPUT という名前である必要はない #受信と経由は「MY-FIREWALL」の設定に従う -A INPUT -j MY-FIREWALL -A FORWARD -j MY-FIREWALL #インタフェースが lo(ループバック / 自分自身に対してのデータ送信)なら通信を許可 -A MY-FIREWALL -i lo -j ACCEPT #通信確立の応答(ESTABLISHED)や、確立済みの通信に関する通信(RELATED)を許可 -A MY-FIREWALL -m state --state ESTABLISHED,RELATED -j ACCEPT #プロトコルが icmp(ICMP / 互いの状態を確認)なら通信を許可 -A MY-FIREWALL -p icmp --icmp-type any -j ACCEPT #プロトコル番号が 50(ESP / パケットが改ざんされていないか認証を行う。パケットの暗号化を行う)なら通信を許可 -A MY-FIREWALL -p 50 -j ACCEPT #プロトコル番号が 51(AH / パケットが改ざんされていないか認証を行う。パケットの暗号化はできない)なら通信を許可 -A MY-FIREWALL -p 51 -j ACCEPT #プロトコルが udp かつ送信先ポートが 5353(Multicast DNS / 数字のアドレスを名前に変換)かつ送信先アドレスが 224.0.0.251 なら通信を許可 -A MY-FIREWALL -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT #プロトコルが udp かつ送信先ポートが 631(Internet Printing Protocol / 印刷データのやりとりを行う)なら通信を許可 #-A MY-FIREWALL -p udp -m udp --dport 631 -j ACCEPT #印刷を使う場合に有効化する #プロトコルが tcp かつ送信先ポートが 631(Internet Printing Protocol / 印刷データのやりとりを行う)なら通信を許可 #-A MY-FIREWALL -p tcp -m tcp --dport 631 -j ACCEPT #印刷を使う場合に有効化する #SSHを許可(IP制限あり) -A MY-FIREWALL -m state --state NEW -m tcp -p tcp --dport 22 -s 203.0.113.0 -j ACCEPT -A MY-FIREWALL -m state --state NEW -m tcp -p tcp --dport 10022 -s 203.0.113.0 -j ACCEPT #以上のチェックにかからなかったパケットを /var/log/messages に記録。ただし記録は1秒間に1回まで -A MY-FIREWALL -j LOG --log-level info --log-prefix "[IPTABLES REJECT]: " -m limit --limit 1/s #以上のチェックにかからなかったパケットは、ICMPパケット host-prohibited を返して接続を拒否 -A MY-FIREWALL -j REJECT --reject-with icmp-host-prohibited ############################## #以上の内容を登録 ############################## COMMIT
# service iptables restart … ファイヤーウォールを再起動
※ループバックの指定 ... 同じコンピュータ上で動作するプログラム同士が、通信し合うときに使う仮想的なインターフェース ※ESTABLISHED,RELATEDの指定 ... サービスの種類によっては開放してあるポートは最初の受付だけに使い、 その後のやりとりは通信相手ごとにランダムなポートが使われる場合がある この場合、何番のポートを開放すればいいか事前に決められない ※ICMPの指定 ... 通信経路確認用の traceroute コマンドや、疎通確認用の ping コマンドを使うために必要なもの ※fail2banを導入している場合、続けて以下を実行しないとfail2banの設定が消えたままになるみたい? ファイヤーウォールを再起動する場合は注意する
# service fail2ban restart
■SSHのポート番号を変更
※22番ポートは一番狙われやすいので変更しておく 自分でSSH接続する際のポート番号も、もちろん変更する ※後から変更すると影響範囲が大きいので、早い段階で変更しておく ■SSHのポート番号を変更
# vi /etc/ssh/sshd_config
#Port 22 Port 10022 … ポート番号を変更
# systemctl restart sshd … SSHを再起動(CentOS6の場合は「# service sshd restart」で再起動)
■ファイヤーウォールを調整(firewalldを使用している場合) このファイル内の「ファイヤーウォールを設定 > SSHのポート番号変更」を参考にする ■ファイヤーウォールを調整(iptablesを使用している場合)
# vi /etc/sysconfig/iptables … ファイヤーウォールを設定(22ポートを閉じる)
#SSHを許可(IP制限あり) #-A MY-FIREWALL -m state --state NEW -m tcp -p tcp --dport 22 -s 203.0.113.0 -j ACCEPT … コメントアウト -A MY-FIREWALL -m state --state NEW -m tcp -p tcp --dport 10022 -s 203.0.113.0 -j ACCEPT
# service iptables restart … ファイヤーウォールを再起動
■ホスト名を設定
※サーバを区別するための名前を付ける。ドメインと同じ値でもいいが同じものでは無いので注意 ドメイン名は「インターネット上のネットワークを特定する文字列」 ホスト名は「ネットワーク上のコンピュータを特定する文字列」 ※名前はサーバからのアラートメールなどにも使われるので、 サーバが複数台構成の場合は web1.refirio.net のように区別できる名前にするといい その場合、DNSのAレコードに web1.refirio.net を登録して、ホスト名でHTTPアクセスできるようにしておく (サーバからメールを送信した際、「送信元サーバのホスト名が、DNSのAレコードで名前解決できない」場合に、迷惑メールとして扱われることがあるため ただしIPによる迷惑メール判定などもあるため、メールサーバはスケーリングさせずに固定IPアドレスを持たせる方がいいかもしれない) ※オートスケーリングを想定した環境などではサーバは使い捨てとなるため、このような名前を付けても意味がないことがある その場合 ip-10-1-0-206 のようにプライベートIPをもとにした名前を機械的に付けると良さそう(AWSのEC2は、デフォルトでそのように付けられていて、HTTPアクセスもできる) ドメイン名・ホスト名・FQDN | IPラーニング https://www.geolocation.co.jp/learn/dns/01.html ■ホスト名を確認
# hostname localhost.localdomain
■ホスト名を変更 CentOS 7 の Hostname を変更する - Qiita https://qiita.com/n-oshiro/items/d18ab37bce2b25b2d5b0 ホスト名の変更(CentOS7) - sanosoft @ ウィキ - atwiki(アットウィキ) https://w.atwiki.jp/sanosoft/pages/58.html ※ホスト名は、サーバ作成時に設定することもある(さくらのクラウドなど) ※hostnameコマンドでもホスト名を変更できるが、サーバを再起動すると戻ってしまう /etc/hostname ( /etc/sysconfig/network ) と /etc/hosts を編集することで、恒久的にホスト名を変更できる ホスト名を変更する場合、早い段階で変更してサーバの再起動テストもしておくといい
# hostnamectl set-hostname refirio.net … refirio.net に変更 # vi /etc/hostname … ファイルを直接編集する場合(hostnamectl を実行すると編集される)
#localhost.localdomain refirio.net … refirio.net に変更
# vi /etc/hosts … 設定
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 127.0.0.1 localhost refirio.net localhost4 localhost4.localdomain4 … refirio.net に変更 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
# hostnamectl status … 確認
sendmail の newaliases が遅い http://bmath.org/wordpress/?p=1691 ※適当なホスト名を付ける場合、「test」のような名前より「test.localdomain」のようにした方がいいみたい ※blog.refirio.net というサイトが2台構成で運用されているとして、 web1.blog.refirio.net のような設定にすると、このURLで正しくSSLアクセスできないことがある(AWSのRoute53で検証) web1-blog.refirio.net のような名前にしておく方が無難そう ※web1.refirio.net よりも web1.refirio の方がいいか ドメインの変化があったり、マルチドメインで運用する場合でも矛盾が無いように思う でも、大抵の例ではドメインになっているし、初期値も localhost.localdomain となっている。ドメインにしておく方が無難かも web1.refirio のようにするなら、メール送信に問題がないかは要確認 ※AmazonLinux2では、デフォルトで ip-172-22-17-11.ap-northeast-1.compute.internal のような名前が付けられる 独自に変更する場合 web1.ap-northeast-1.compute.internal のようにするのはありかも ■CentOS6の場合 CentOS 6 - ホスト名を設定する http://www.server-world.info/query?os=CentOS_6&p=hostname CentOS6 インストール後の設定 http://centos.server-manual.com/centos6_setup.html Linuxのホスト名を変更する http://www.searchman.info/tips/1360.html
# hostname refirio.net … refirio.net に変更 # vi /etc/sysconfig/network … 設定
NETWORKING=yes #HOSTNAME=localhost.localdomain HOSTNAME=refirio.net … refirio.net に変更 NETWORKING_IPV6=yes IPV6_DEFAULTDEV=eth0 IPV6_DEFAULTGW=fe80::1
# vi /etc/hosts … 設定(編集箇所はCentOS7と同じ)
■スワップ領域を設定
※メモリ不足の際に、ハードディスクの一部をメモリとして扱えるようにする ※スワップ領域がない場合、メモリ不足になるとOOM Killerによって早々にプロセスを終了させられる スワップ領域がある場合、メモリ不足になるとスワップが使われるため、プロセスの強制終了が発生しにくくなる ただしハードディスクの読み書きはメモリに比べて遅いので、処理速度は大幅に落ちる 可能なら十分な量の実メモリを搭載することが望ましいが、保険として設定しておくといい ※スワップ領域が割り当てられていない場合に設定するといい(AWSのEC2など) ※AWSのECはデフォルトでスワップ領域を割り当てられていないが、これはインスタンスによってメモリサイズが異なるためらしい ※スワップのサイズは、一般的にメモリサイズの2倍が設定される もしくは「いったん2GBを設定して様子を見る」でもいいかもしれない スワップは、設定した分だけストレージの容量を消費するので注意 Amazon EC2(Linux)のswap領域ベストプラクティス http://dev.classmethod.jp/cloud/ec2linux-swap-bestpractice/ AWS Amazon Linux スワップファイル作成によりSwap領域のサイズを増やす http://qiita.com/na0AaooQ/items/278a11ed905995bd16af EC2 Amazon Linux を立ち上げた時にする初期設定 http://qiita.com/shojimotio/items/79264678e9ea10b6fd19 AWSのEC2にはSWAPメモリがない | マリンロード https://www.marineroad.com/staff-blog/24546.html ■スワップ領域を確認
# free … swap領域を確認 total used free shared buffers cached Mem: 1017260 137336 879924 60 9192 76784 -/+ buffers/cache: 51360 965900 Swap: 0 0 0 … swap領域が割り当てられていない場合に以下を設定
■スワップ領域を設定
# dd if=/dev/zero of=/mnt/swapfile bs=1M count=2048 … swap用のファイルを作成(count=2048 なので、この場合2Gのswapを作成) 2048+0 レコード入力 2048+0 レコード出力 2147483648 バイト (2.1 GB) コピーされました、 125.385 秒、 8.6 MB/秒 # mkswap /mnt/swapfile … swap用ファイルをswap領域にセット スワップ空間バージョン1を設定します、サイズ = 4194300 KiB ラベルはありません, UUID=4bfaa823-0227-43ca-aab1-f7dbb788fb03 # swapon /mnt/swapfile … swap領域を有効化 swapon: /mnt/swapfile: 安全でない権限 0644 を持ちます。 0600 がお勧めです。 # chmod 0600 /mnt/swapfile … パーミッションを設定 # vi /etc/fstab … 再起動してもswap領域がアクティブになるようにする
LABEL=/ / ext4 defaults,noatime 1 1 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 /mnt/swapfile swap swap defaults 0 0 … 追加
# free … swap領域を確認 total used free shared buffers cached Mem: 1017260 956900 60360 60 9376 870244 -/+ buffers/cache: 77280 939980 Swap: 2097148 0 2097148 … swap領域が割り当てられている
■スワップ領域を解除する場合
# swapoff /mnt/swapfile … 設定し直す際に実行する(スワップ領域を無効にする)
■スワップ領域を開放する場合 ※未検証 物理メモリが断片化している場合、以下の方法でスワップ領域を開放することができる ただしディスクI/O不可が非常に高く、かつ時間もかかるので実稼働中のサーバで行うのは危険なので注意
# swapoff -a … スワップ領域の開放と無効化 # swapon -a … スワップ領域の有効化
■パッケージ管理システムを設定
# yum -y install yum-fastestmirror … インストールパッケージダウンロード時の最適ミラーサイト(ダウンロードの早いサイト)を自動選択させる # yum -y update … インストール済パッケージの一括アップデート # yum -y install yum-cron … cronをインストール # systemctl start yum-cron … パッケージ自動更新起動 # systemctl enable yum-cron … パッケージ自動更新自動起動設定 # systemctl is-enabled cron … 自動起動を確認する # systemctl list-unit-files -t service | grep cron … 自動起動を確認する # systemctl | grep cron
サービスの操作はsystemctlコマンドで行うように変更されている ただし現時点ではserviceを使うとsystemctlに転送されるため、serviceでも操作できる (このサーバメモでは、まだserviceとsystemctlが混在している) サービス操作
# systemctl (start|stop|restart|status ...etc) (サービス名).service # systemctl start yum-cron.service … 実例
サービス自動起動設定
# systemctl (enable|disable|is-enabled) (サービス名).service # systemctl enable yum-cron.service … 実例
サービスを確認
# systemctl | grep nginx # systemctl list-unit-files -t service | grep nginx
サービスの状態を確認
# systemctl is-enabled nginx … 自動起動の設定を確認する # systemctl list-unit-files # systemctl list-unit-files -t service
「yum-cron.service」は「yum-cron」のように省略しても問題ないみたい systemctlでよくつかうオプションまとめ - かべぎわブログ https://www.kabegiwablog.com/entry/2018/06/13/100000 systemctl コマンド - Qiita https://qiita.com/sinsengumi/items/24d726ec6c761fc75cc9 【新旧対応】Linuxでの自動起動の設定方法を解説 https://eng-entrance.com/linux_startup ■CentOS6の場合
# yum -y install yum-fastestmirror # yum -y update # yum -y install yum-cron # service yum-cron start # chkconfig yum-cron on # chkconfig --list
■各種ツールをインストール
※必要に応じて追加する
# yum -y groupinstall "Base" "Development tools" … gccやgitなどの基本的な開発ツールを一括インストール # yum -y groupinstall "Base" "Development tools" --setopt=group_package_types=mandatory,default,optional … 上記コマンドでインストールできない場合(CentOS7など) # yum -y install sysstat … システムの状態を監視するツール # yum -y install dstat … リソースを監視するツール # yum -y install iotop … I/Oプロセスを監視するツール # yum -y install nethogs … 通信量の多いプロセスを調べるツール # yum -y install iftop … 通信量の多い相手を調べるツール # yum -y install zip # yum -y install unzip
CentOS7環境でgccやgitなどの開発ツールを一括インストールしようとすると、
# yum -y groupinstall "Base" "Development tools" Warning: Group development does not have any packages to install.
となってインストールできなかった CentOS7環境では上記のように、「--setopt」のオプションを追加するとインストールできる (Amazon Linux 2 ではこのCentOS7の方法でも、CentOS6と同じ方法でもどちらでもインストールできた) CentOS7 で yum groupinstall が出来ないんですけど。。。 - Qiita https://qiita.com/madaran0805/items/1cac9c921cec4e8a23e7 ■AmazonLinuxの場合 nethogsとiftopは、以下のようにすればインストールできる
# yum -y install epel-release # yum -y install --enablerepo=epel nethogs # yum -y install epel-release # yum -y install --enablerepo=epel iftop
■ユーザを作成
※必要に応じて追加する。root ユーザしかいない場合、作業用ユーザを作成することを強く推奨 ※AWSのEC2では始めから ec2-user が作成されているので、これを利用すればいい ■ユーザを作成
# useradd refirio … 一般ユーザ「refirio」を作成 # passwd refirio … 「refirio」のパスワードを設定 # cat /etc/passwd … ユーザ一覧を確認する場合 # groups refirio … 「refirio」ユーザが属するグループを確認する場合 refirio : refirio wheel # su - refirio … 「refirio」になる場合 # su -s /bin/bash - refirio … シェルを指定して「refirio」になる場合 # userdel -r refirio … 「refirio」を削除する場合 $ passwd … 一般ユーザが自身のパスワードを変更する場合
これで、Poderosaなどから以下の情報で接続できる (ただしパスワード認証が禁止されているサーバの場合、引き続き鍵認証の設定を行う必要がある) 接続先 : サーバのアドレス プロトコル : SSH2 ポート番号 : 22 (ポート番号を変更した場合はその番号) ユーザ名 : 設定したユーザ名 パスワード : 設定したパスワード オプションを指定することで、有効期限やログインシェルを指定してアカウントを作成したりもできる useraddコマンドについて詳しくまとめました 【Linuxコマンド集】 https://eng-entrance.com/linux-command-useradd Linuxコマンド【 passwd 】ユーザーのパスワードを変更 - Linux入門 - Webkaru https://webkaru.net/linux/passwd-command/ ■鍵で認証できるように設定(サーバ内で鍵の作成を行う場合)
# su refirio $ cd $ ssh-keygen -t rsa $ cd /home/refirio/.ssh $ cp id_rsa.pub authorized_keys $ chmod 600 authorized_keys
これで /home/refirio/.ssh/id_rsa をダウンロードして鍵ファイルとして指定すれば、 SSHで refirio ユーザとして鍵認証で接続できる 接続先 : サーバのアドレス プロトコル : SSH2 ポート番号 : 22 (ポート番号を変更した場合はその番号) ユーザ名 : 設定したユーザ名 秘密鍵 : 作成した秘密鍵 パスワード : 作成した秘密鍵のパスワード(パスワードを設定していなければ空欄で認証) ■鍵で認証できるように設定(Poderosaで鍵の作成を行う場合) ・Poderosaなどで鍵(公開鍵・秘密鍵)を作成する Poderosaの場合、メニューの「ツール → SSH鍵作成ウィザード」から作成できる 鍵は「RSA」の「2048」で作成するといい パスワードなしの鍵を作成することもできる 「秘密鍵を名前をつけて保存」から秘密鍵を、「OpenSSH形式で公開鍵を名前をつけて保存」から公開鍵を保存できる WindowsからSSHサーバーへリモート接続(Poderosa鍵方式ログイン編) http://fedorasrv.com/poderosa-public.shtml SSH2鍵方式でログイン 〜自(己満足)宅サーバー〜 http://jintaro.com/fedoracore5/fc5_poderosa_key.shtml CentOS7.3でSSH接続(公開鍵認証)する方法 - Qiita https://qiita.com/uhooi/items/137de4578534c8e7e7f2 root権限で、上記で作成した公開鍵をサーバに配置する
# mkdir -p /home/refirio/.ssh … 公開鍵格納用ディレクトリを作成 # chmod 700 /home/refirio/.ssh … 公開鍵格納用ディレクトリのパーミッションを変更 # vi /home/refirio/.ssh/authorized_keys … 公開鍵をauthorized_keysに保存(鍵認証時、この場所にこのファイル名で保存したファイルが参照される)
ssh-rsa xxxxxxxxxx … 作成した公開鍵の内容を全てコピーして貼り付ける
# chmod 600 /home/refirio/.ssh/authorized_keys … authorized_keysのパーミッションを変更 # chown -R refirio:refirio /home/refirio … ユーザディレクトリの所有者を変更
作成した秘密鍵を使えば、「サーバ内で鍵の作成を行う場合」と同様にサーバに接続できる ■rootになれるユーザを管理者のみにする
# usermod -G wheel refirio … 「wheel」グループ(rootになれるユーザのグループ)にユーザを追加 # vi /etc/pam.d/su
#auth required pam_wheel.so use_uid auth required pam_wheel.so use_uid … コメント解除
■作業用ユーザで sudo ができるようにする ・visudoコマンドは「vi /etc/sudoers」と同じ ただし /etc/sudoers は読み取り専用ファイルで、ファイル内にも「visudoコマンドで編集すべき」と書かれている ・root操作に関わる設定なので、気軽に編集できないようにされていると思われる
# visudo
# %wheel ALL=(ALL) ALL %wheel ALL=(ALL) ALL … コメント解除
CentOSでuserをsudo可能にする - Qiita https://qiita.com/Esfahan/items/a159753d156d23baf180 sudoの権限を設定するvisudoコマンド【Linuxコマンド集】 https://eng-entrance.com/linux-command-visudo ■rootでの直接ログインを禁止・パスワード無しのログインを禁止
# vi /etc/ssh/sshd_config
#PermitRootLogin yes PermitRootLogin no … noに設定(rootでの直接ログインを禁止) #PermitEmptyPasswords no PermitEmptyPasswords no … コメント解除(パスワード無しのログインを禁止)
# systemctl restart sshd … SSHを再起動
なお、/etc/ssh/sshd_config の以下の部分によってパスワード認証の許可と禁止を行うことができる CentOS7では、初期設定でパスワード認証が禁止されている
PasswordAuthentication no … noだとパスワード認証は禁止(yesだと許可)
■同じユーザで複数の鍵を使い分ける 同じユーザに複数の鍵を設定することができる これにより、1つのユーザでもAさんからのアクセスは許可してBさんからのアクセスは禁止…のような制御ができる authorized_keysに改行区切りで複数の公開鍵を記載すると、対応する各秘密鍵で認証できるようになる
# vi /home/refirio/.ssh/authorized_keys
ssh-rsa xxxxxxxxxx ssh-rsa yyyyyyyyyy ssh-rsa zzzzzzzzzz
複数の公開鍵を使い分ける - May the Source be with you https://mizuno.hatenadiary.org/entry/20080705/1215238138 サーバーに複数の公開鍵で接続するために authorized_keys を複数設定する方法 | ウェブル http://weble.org/2011/10/27/authorized-keys ■ホームディレクトリより上層へのアクセスを禁止する ※先に鍵認証の設定などをして接続確認もしておく ・chrootを使う ・/etc/ssh/sshd_config で「特定ユーザに対して ChrootDirectory が実行されるようにする」と設定する ・ただしそれだけだと対象ユーザがコマンドを参照できなくなるので、あらかじめユーザ領域にコマンドをコピーする という流れで設定する 以下が参考になりそう chroot【コマンド】とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 http://wa3.i-3-i.info/word13814.html chroot環境の作成 - Qiita https://qiita.com/yan16/items/ffb8c791405f5e8eac25 特定のユーザのみSFTPでchrootする | Developers.IO https://dev.classmethod.jp/cloud/aws/sftp-chroot/ WindowsからSSHサーバーへファイル転送(WinSCP) - CentOSで自宅サーバー構築 http://centossrv.com/winscp.shtml SSHサーバー構築(OpenSSH) - CentOSで自宅サーバー構築 http://centossrv.com/openssh.shtml SFTPでchrootを設定しつつSSHでログインできないユーザーを作成する | work.log https://worklog.be/archives/3510 以下が分かりやすそうなので、参考にして実際に試してみた chrootを用いてSSHユーザのディレクトリを制限する | ハックノート https://hacknote.jp/archives/32888/ 以下で検証してchrootが有効になっているのを確認できた ただし後述しているが、引き続き検証したいことはある
# cd /home/refirio # cp -rp /bin /home/refirio/bin # cp -rp /lib /home/refirio/lib # cp -rp /lib64 /home/refirio/lib64 # mkdir usr # cp -rp /usr/bin /home/refirio/usr/bin # cp -rp /usr/lib /home/refirio/usr/lib # cp -rp /usr/lib64 /home/refirio/usr/lib64 # chown root. /home/refirio # chmod 755 /home/refirio # cd /home/refirio # chown refirio. * # vi /etc/ssh/sshd_config
# override default of no subsystems #Subsystem sftp /usr/libexec/openssh/sftp-server … コメントアウト Subsystem sftp internal-sftp … 追加 Match User refirio … 以降を末尾に追加(複数ユーザがある場合、さらに末尾に追加していく) ChrootDirectory /home/refirio X11Forwarding no AllowTcpForwarding no PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
# systemctl restart sshd
以上でrefirioユーザに対してchrootが適用された /home/refirio の所有者をrootにすると refirio がファイルを作成したりできないが、rootにしておかないとログインできない(すぐに接続が終了される) ホームディレクトリ直下に別途 document などを作って所有者を refirio にし、この中で作業してもらうくらいか 以下は検証したいことメモ ・ユーザディレクトリの所有者はrootで、権限変更で書き込み権限を与えたりするとどうなるか ・binなどの命令をコピーしなかったらどうなるのか ・llコマンドを使えるようにできるか ・コマンド入力時にDelキーなどを使えるようにできるか ・ホームディレクトリ内ではなく、/var/www 内だけで作業させるようにもできるか ・Vagrantでも同様の環境を作れるか chrootからの脱出も試したい 仙石浩明の日記: chroot されたディレクトリから脱出してみる http://www.gcd.org/blog/2007/09/132/
■root宛メールを転送
※root宛メールの転送先を設定する Cronエラーなどがroot宛に送られるので、それらを受信する
# sed -i '/^root:/d' /etc/aliases … 旧root宛メール転送設定削除 # echo "root: refirio@example.com" >> /etc/aliases … root宛メールを普段使用しているメールアドレス宛に転送する # newaliases … 転送設定反映 # yum -y install mailx … mailコマンドインストール # echo test | mail root … テストメールをroot宛に送信する
以下で設定されているホスト名に差異がある場合、メールが送信されない模様。正しく設定する hostname /etc/hosts /etc/sysconfig/network mailコマンドで本文・タイトル・送信元・送信先を指定する場合は以下のようにする Gmailに送信して届かない場合、プロバイダやレンタルサーバのメールアドレスへの送信を試す # echo "本文" | mail -s "タイトル" -r from@example.com to@example.com [mailコマンド]Linuxからメールを送る - Qiita https://qiita.com/shuntaro_tamura/items/40a7d9b4400f31ec0923 なお「sed -i '/^root:/d' /etc/aliases」と「echo "root: refirio@example.com" >> /etc/aliases」については、 以下のように vi などで直接設定を追加しても問題ない
# vi /etc/aliases
#root: marc root: refirio@example.com … root宛メールを普段使用しているメールアドレス宛に転送する
過去のroot宛メールが残り続けて肥大化することを避けるため、ログローテートの設定を行うといい 詳細は後述の「root宛メールの内容をローテート」を参照
■コマンド履歴に実行日時を追加
※未検証 ※検証したら Command.txt 側に書いた内容も調整する コマンド履歴に実行日時は記録されていないが、記録しておくとトラブル時の調査に役立つ可能性がある HISTTIMEFORMAT を設定することで、自動で記録することはできるみたい 永続化の作業が別途必要みたいなので注意 historyにコマンドの実行時刻が表示されるようにする - Qiita https://qiita.com/kawaz/items/92457e3d1664383b18bc history コマンドに日時を付与する - Qiita https://qiita.com/bezeklik/items/56a597acc2eb568860d7
■ログローテートを設定
■ログ保存期間を設定 ※本番環境などで、ログの保存期間を伸ばしたい場合に設定する ※プロバイダ責任制限法のこともあるので、原則3ヶ月以上ログを保存しておくのが良さそう logrotate.confファイルを読み解くメモ http://masasuzu.hatenablog.jp/entry/20111117/1321512757 ログローテートソフトウエア logrotate についてまとめ - Qiita https://qiita.com/shotets/items/e13e1d1739eaea7b1ff9
# vi /etc/logrotate.conf
#rotate 4 rotate 12 … 3ヶ月(12周間)残す場合(※restartなどは不要と思われるが要検証)
なお個別の設定が /etc/logrotate.d にあり、そちらの方が優先されるので注意 またAWSの場合、この期間を長くするよりも、CloudWatch Logsに転送する方が正攻法だと思われる ■ログローテートの追加例 /etc/logrotate.d 内に例えば sample というファイルを作成し、以下のように記述する
/path/to/sample/*.log { daily rotate 14 missingok notifempty compress }
以下で想定の結果を確認できる
# logrotate -dv /etc/logrotate.conf
以下で実際にローテートが実行される
# logrotate /etc/logrotate.conf
以下のようなエラーになってローテートされない場合、設定内の最初に「su root root」と記述するといい
rotating pattern: /path/to/sample/file after 1 days (14 rotations) empty log files are not rotated, old logs are removed considering log /path/to/sample/file error: skipping "/path/to/sample/file" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
任意のログをlogrotateを使って管理する - Qiita https://qiita.com/Esfahan/items/a8058f1eb593170855a1 logrotate 〜 ログがローテートされないときに〜 - GMOインターネットグループ グループ研究開発本部(次世代システム研究室) https://recruit.gmo.jp/engineer/jisedai/blog/logrotate/ 1777 なディレクトリのログを logrotate したときのエラー - Qiita https://qiita.com/ngyuki/items/9a0ebfdb09e3b779e4fd 【Linux】パーミッションエラーでログローテーションされない時の対処法|RyoNotes https://ryonotes.com/linux-logrotate-permission-error/ ログローテートの具体例は、Etcetera.txt の「root宛のメールを削除する」も参照 ■root宛メールの内容をローテート /etc/logrotate.d/mail を作成し、以下を記述する これでroot宛メールの内容がローテートされ、古いものは自動で削除される (サーバの異常は、別途監視ツールなどで把握する前提)
/var/spool/mail/root { su root root daily rotate 14 missingok notifempty compress }
■logrotateでのプロセス中断対策 ※未検証 ログローテートの際にApacheやNginxは再起動されるみたい 「後日再読み込みさせよう」として設定ファイルを編集していると、自動で適用されてしまう可能性があるので注意 以下はApacheとNginxのログローテートのデフォルト設定
# cat /etc/logrotate.d/httpd /var/log/httpd/*log { missingok notifempty sharedscripts delaycompress postrotate /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true endscript } # cat /etc/logrotate.d/nginx /var/log/nginx/*.log { create 0640 nginx root daily rotate 10 missingok notifempty compress delaycompress sharedscripts postrotate /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true endscript }
以下に再起動への対策が書かれている 「systemctl reload httpd.service」を「systemctl graceful httpd.service」にすれば良さそう サービスを停止せずにログローテーション(logrotate)を行う - ゆーも https://humo-life.net/blog/centos/187/ nginxの場合は 「nginx -s reload」でgraceful扱いになるようだが、そもそも「restart」や「reload」と書かれていない 対策は不要か、もしくは別の対策が必要か 「nginx実践ガイド」のコマンドのメモ - Qiita https://qiita.com/u310i/items/3b99b2dfb4897ca83374 【nginx】『途中の処理』を途中で止めないサーバー再起動【652日目】 - エンジニアのひよこ_level10 https://www.nyamucoro.com/entry/2019/07/27/222829 Nginxでgracefulってどうやるの!? - ADACHIN SERVER LABO https://blog.adachin.me/archives/2820 Nginx を再起動せずに設定の変更だけ適用(graceful)する | PzGleaner https://pzgleaner.com/archives/nginx-graceful Nginxでgraceful - ハックノート https://hacknote.jp/archives/20066/ 「/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true」の意味は以下が参考になるか 任意のログをlogrotateを使って管理する - Qiita https://qiita.com/Esfahan/items/a8058f1eb593170855a1
■SELinuxを設定
■SELinuxを無効にして使う ※SELinuxはシステムのセキュリティを強固にする仕組み。難解なため無効に設定されることが多かった が、現在はSELinuxに由来するトラブルは非常に少なくなったため、導入は有効らしい そのうちに調べる
# getenforce … SELinuxの状態を確認 Enforcing … SELinuxが有効 # setenforce 0 … SELinuxを無効化 # getenforce … SELinuxの状態を確認 Permissive … SELinuxが無効 # vi /etc/selinux/config
SELINUX=enforcing SELINUX=disabled … システム起動時にSELinuxを無効化
■SELinuxを無効にせずに使う ※未検証 以下、参考になりそうなサイトのメモ そろそろSELinux を有効にしてみませんか? https://www.slideshare.net/atsushimitsu/selinux-87020074 [CentOS7][Nginx] SELinuxを設定しホームディレクトリ配下のWebコンテンツを公開を許可 | from umentu import stupid https://www.blog.umentu.work/centos7nginx-selinux%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%83%9B%E3%83... CentOS7/RHEL7でむやみにSELinuxポリシー追加せずにnginx apacheをEnforcingのまま動かす - Qiita https://qiita.com/egnr-in-6matroom/items/fcd7c69f07aea338a3be 【ざっくりと理解する】SELinuxとは? https://eng-entrance.com/linux-selinux ■SELinuxが無効にされているシステムで有効にする ※未検証 以下、参考になりそうなサイトのメモ Amazon LinuxでSELinuxを有効にする。 - Qiita https://qiita.com/hichon/items/b80fecd3a4875b827985
■不要な機能を無効にする(今は不要かも)
※余計な機能が動いていると、セキュリティホールになりかねないので無効にする ※ただし以前ほど余計な機能はプリインストールされていないことが多いので、今は以下については気にしなくていいかもしれない ■不要なデーモンをストップ
# chkconfig acpid off # chkconfig auditd off # chkconfig autofs off … さくらVPSでは「そのようなファイルやディレクトリはありません」となる # chkconfig avahi-daemon off … さくらVPSでは「そのようなファイルやディレクトリはありません」となる # chkconfig bluetooth off … さくらVPSでは「そのようなファイルやディレクトリはありません」となる # chkconfig cups off … さくらVPSでは「そのようなファイルやディレクトリはありません」となる # chkconfig firstboot off … さくらVPSでは「そのようなファイルやディレクトリはありません」となる # chkconfig gpm off … さくらVPSでは「そのようなファイルやディレクトリはありません」となる # chkconfig haldaemon off # chkconfig hidd off … さくらVPSでは「そのようなファイルやディレクトリはありません」となる # chkconfig isdn off … さくらVPSでは「そのようなファイルやディレクトリはありません」となる # chkconfig kudzu off … さくらVPSでは「そのようなファイルやディレクトリはありません」となる # chkconfig lvm2-monitor off # chkconfig mcstrans off … さくらVPSでは「そのようなファイルやディレクトリはありません」となる # chkconfig mdmonitor off # chkconfig messagebus off # chkconfig netfs off # chkconfig nfslock off … さくらVPSでは「そのようなファイルやディレクトリはありません」となる # chkconfig pcscd off … さくらVPSでは「そのようなファイルやディレクトリはありません」となる # chkconfig portmap off … さくらVPSでは「そのようなファイルやディレクトリはありません」となる # chkconfig rawdevices off … さくらVPSでは「そのようなファイルやディレクトリはありません」となる # chkconfig restorecond off # chkconfig rpcgssd off … さくらVPSでは「そのようなファイルやディレクトリはありません」となる # chkconfig rpcidmapd off … さくらVPSでは「そのようなファイルやディレクトリはありません」となる # chkconfig smartd off # chkconfig xfs off … さくらVPSでは「そのようなファイルやディレクトリはありません」となる # chkconfig yum-updatesd off … yum-updatesd を削除したら「Nそのようなファイルやディレクトリはありません」となる
■不要なコンソールを無効にする
# vi /etc/inittab
#2:2345:respawn:/sbin/mingetty tty2 #3:2345:respawn:/sbin/mingetty tty3 #4:2345:respawn:/sbin/mingetty tty4 #5:2345:respawn:/sbin/mingetty tty5 #6:2345:respawn:/sbin/mingetty tty6
ttyというのは TeleTYpewriter(テレタイプライター)に由来する テレタイプライターとは、今日ではほとんど使われなくなった電動機械式タイプライターのこと UNIXができた頃のコンピューター事情 | FJORD BOOT CAMP(フィヨルドブートキャンプ) https://bootcamp.fjord.jp/articles/37 ■参考 以下は上の内容を試したときよりも後発の記事 よく読んで検証したい systemd編〜サーバーで不要なものは動かさない〜 - Linuxセキュリティ入門(1) | さくらのナレッジ https://knowledge.sakura.ad.jp/21779/

Advertisement