2022 年度 OSS リテラシー 3 : セキュリティ対策 (ssh)
はじめに
SSH では通信は暗号化されているが, さらにセキュリティを高める方法として, 以下の 2 つがある.
- パスワード認証を無効化し公開鍵認証のみにする
- SSH 接続が可能なホストを限定する
本手順書では Windows から公開鍵認証でログインできるようにしたのちに, 上記の (1) の手順を行うことにする. (2) は今回はパスする.
なお, SSH はデフォルトでパスワード認証と公開鍵認証の両方をサポートしている.
Windows => Linux 公開鍵認証でのアクセス (Putty の設定)
公開鍵・秘密鍵の作成 (Windows)
まず Windows で公開鍵・秘密鍵を作成する. 公開鍵と秘密鍵は C: ドライブ以下に学生番号のフォルダを作り, そこに保管すること (そうしないとファイルが消えます = 学校の PC の仕様. USB メモリにも保存しておくと良い).
- PuTTygen を起動 (C:\Program Files\PuTTY\).
- "Generate" ボタンを押す. マウスの動きで乱数生成を行うので, PuTTygen のウインドウ上で適当にマウスを動かす.
- 新たなウインドウが開いたら, "Key_passphrase" と "Confirm passphrase" にパスフレーズを入れる (パスフレーズは自分で考えること. ログインパスワードと同じにしないこと)
- "Save public key", "Save private key" を順番におして, 公開鍵と秘密鍵を保存する.
- C: ドライブ直下に学生番号のフォルダを作成し, そこに保存すること.
- ファイル名はそれぞれ public, private などとする.
- 保存を終えたら PuTTygen を終了する.
公開鍵の登録 (Linux)
Windows で作成した公開鍵を VM に登録する. Filezila, winscp などを使っても良いが, VM でファイルを新規作成してそこにコピペするのが簡単だと思う.
まず初めに,作成した公開鍵をメモ帳で開く.
次に,ログイン済みの putty のターミナル上で vi で id_rsa.pub というファイルを開き, 自分の公開鍵の内容をコピーする.
$ vi ~/id_rsa.pub
vm 上で公開鍵の形式を変換して, それを ~/.ssh/authorized_keys に保存する. すでに SSH で接続しているので, .ssh ディレクトリは作られているはずであるが, もしも ~/.ssh ディレクトリが存在しない場合は以下のように作成する.
$ mkdir .ssh $ chmod 700 .ssh
Windows からコピーした公開鍵を使えるようにするためには,以下のようにする.
$ ssh-keygen -i -f ~/id_rsa.pub >> ~/.ssh/authorized_keys $ chmod 600 ~/.ssh/authorized_keys
接続テスト (Windows => Linux)
putty から vm へ接続する. メッセージをみて, 公開鍵認証でアクセスできることを確認すること.
- PuTTy を起動 (C:\Program Files\PuTTY\).
- Host Name に接続先の IP もしくはホスト名を入力
- Category から "Connection" => "SSH" => "Auth" を選び, "Private Key file for authentication" の項目に「秘密鍵」を入力する.
- "Open" を押す.
ssh の設定の修正 (Linux)
パスワード認証の無効化.
ssh でパスワードによる認証を無効にし, 公開鍵認証のみをサポートする.
$ sudo -s # cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bk # vi /etc/ssh/sshd_config 変更箇所は以下の通り. #PubkeyAuthentication yes (変更前) PubkeyAuthentication yes (変更後, コメントアウトを外す) # To disable tunneled clear text passwords, change to no here! #PasswordAuthentication yes (変更前) PasswordAuthentication no (変更後, コメントアウトを外し, yes -> no にする)
設定を変更したら ssh サーバを再起動する.
# /etc/init.d/ssh restart [ ok ] Restarting ssh (via systemctl): ssh.service. # exit $
フィルタリング : fail2ban (iptables)
fail2ban はログを監視し, 特定のパターンに引っかかる動作が記録されたらファイヤウォールに動的にルールを追加して, 通信をブロックする. 例えば ssh のブルトフォース攻撃 (パスワード総当たり攻撃) のように, 頻繁にアクセス & ログイン失敗を繰り返すホストからのアクセスを切断する.
インストールは apt-get で行う.
$ sudo -s # apt-get update # apt-get install fail2ban
fail2ban の設定ファイルは /etc/fail2ban/jail.conf および /etc/fail2ban/jail.d/defaults-debian.conf である. 各ポートに対して /etc/fail2ban/filter.d/ 以下にフィルタが用意されている. デフォルトの設定では ssh のみ監視されている.
sshd が監視対象となっていることは, 以下のコマンドを実行すれば確かめられる.
# fail2ban-client status Status |- Number of jail: 1 `- Jail list: sshd
ban された時の動作
ssh で何度もパスワード入力を誤ると fail2ban によって ban される (以下のように ssh コネクションが切られる). デフォルトでは 10 分間接続不可となる.
$ ssh XX.XX.XX.XX ssh: connect to host 10.138.64.109 port 22: Connection refused
ラズパイで ssh アクセスで ban された IP を確認するためには以下のようにする.
# fail2ban-client status sshd Status for the jail: sshd |- filter | |- File list: /var/log/auth.log | |- Currently failed: 0 | `- Total failed: 6 `- action |- Currently banned: 1 | `- IP list: 10.164.1.197 `- Total banned: 1
ban された IP を解除するには以下のようにコマンドをうつ.
# fail2ban-client set sshd unbanip XX.XX.XX.XX (ban された IP)
課題
- diff コマンドを用いて ssh の設定ファイル (sshd_config) の変更箇所を表示し, それを wbt にて提出せよ.
- 上記手順書では, 元ファイルを sshd_config.bk として残している. そのため, sshd_config と sshd_config.bk を diff コマンドの引数に与えれば良い.