■概要
サーバの基本設定に関するメモ
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
AlmaLinuxを使ってみた(前編) - Qiita
https://qiita.com/yamada-hakase/items/245da3df19e9334d041c
CentOS 8の移行を考える - Qiita
https://qiita.com/yamada-hakase/items/2e015d9b09be97724ab0
■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
■言語を設定
※コンソールの表示を日本語にする
初期状態では大抵英語になっている
# 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 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
# systemctl is-enabled crond.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コマンドで本文・タイトル・送信元・送信先を指定する場合は以下のようにする
# 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宛メールを普段使用しているメールアドレス宛に転送する
■コマンド履歴に実行日時を追加
※未検証
※検証したら 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宛のメールを削除する」も参照
■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/sysconfig/selinux
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/