SSH(Secure Shell)
ネットワークを経由したサーバとの通信を安全に利用するためのプロトコル
公開鍵暗号で共通鍵を暗号化して鍵交換を行い、通信データは共通鍵暗号を用いて高速に処理できる
特徴
- セッション毎に異なる暗号鍵を生成して使用
ホスト認証(サーバ認証)
- 接続しようとしているサーバが正しいものであることを利用者が検証する作業
- 初回
- 接続するとサーバからホスト公開鍵を受信
初回接続時に限っては、接続先サーバのホスト鍵を持っていないので、接続先ホストが登録されていない旨のメッセージが出力される
$ ssh inittest The authenticity of host '[127.0.0.1]:2222 ([127.0.0.1]:2222)' can't be established. ECDSA key fingerprint is SHA256:4zEtjbEZu0bl7/f9VViFO4keryXlJpNMzANpmrGeBWQ. Are you sure you want to continue connecting (yes/no)? yes Last login: Tue Apr 24 07:33:52 2018 from 10.0.2.2
- ホスト鍵はホスト公開鍵とホスト秘密鍵に分かれており、クライアント上には通常
known_hosts
と呼ばれるファイルがあり、ここには特定の IPアドレス (とホスト名) をもつサーバのホスト公開鍵が登録されている - ホスト秘密鍵はサーバマシン内のディスクに格納されており、ネットワーク上に持ち出されることはない
- /etc/ssh ディレクトリ以下に秘密鍵が作成される
- ホスト鍵はホスト公開鍵とホスト秘密鍵に分かれており、クライアント上には通常
- 受信したホスト公開鍵を確認し、保存
- 次回接続時には、受信したホスト公開鍵と保存したホスト公開鍵を比較して、正しい接続先かどうかの確認を行う
- 接続するとサーバからホスト公開鍵を受信
- ホスト認証が終わると、ユーザ認証が行われる
- パスワード認証
- 公開鍵認証
ポートフォワーディング機能
暗号化機能を備えていないアプリケーションの通信を SSH が間に入って中継することで、暗号化を行う機能
ssh -L 個人 PC のポート番号:接続先ホスト:接続先ポート番号 中継ホスト
172.17.0.4 への HTTP 接続を 10.0.12.10 を経由して自身の環境と接続するポートフォワード設定
$ sudo ssh -L 1080:172.17.0.4:80 -l admin 10.0.12.10
- http://localhost:1080/ にアクセスすると、172.17.0.4:80 へアクセスすることになる
X 転送
$ sudo ssh -L 1022:192.168.10.10:22 -l admin 192.168.10.5 $ ssh -X admin@localhost -p 1022 $ sudo XAUTHORITY=~/.Xauthority virt-manager
公開鍵鍵認証
ファイルを標準出力し、それを別サーバのファイルへ書き込む
$ cat testfile | ssh 192.168.122.10 'cat > /tmp/testfile'
/etc/ssh/sshd_config
test ユーザのみパスワード認証を許可
Match User test PasswordAuthentication yes
MaxStartups
- 認証が完了していない SSH 接続の同時接続許容数の最大値
~/.ssh/config
サンプル
Host alias HostName ip address User username IdentityFile ~/.ssh/id_rsa ServerAliveInterval 60
接続を早くする ※ 暗号アルゴリズムは弱い
$ ssh -c arcfour
オプション
オプション 用途 StrictHostKeyChecking 初めての接続や、対象サーバのフィンガープリントが変更になった場合、メッセージが出力される
このメッセージに回答しないと先に進めないが、-o StrictHostKeyChecking=no を追加すると聞かれること無く処理を進めることができる
SSH セキュリティ
/etc/ssh/sshd_config
Port
- 待ち受けポートを変更する
- 22 => 2022 とか
Protocol
- バージョン 1 には脆弱性が見つかっているので、バージョン 2 のみを利用する
PermitRootLogin
- root ユーザのログイン許可設定
- yes
- 許可
- no
- 拒否
- without-password
- パスワードを使用したログイン拒否
- forced-commands-only
- 直接ログインを拒否するが、root 権限を使うコマンドのアクセスは許可
- scp コマンド
PermitEmptyPasswords
空パスワードは許可しない
PermitEmptyPasswords no
PasswordAuthentication
公開鍵認証を設定しているのならパスワード認証は不要のはず
PasswordAuthentication no
MaxAuthTries
指定された回数内にログインできなければ、接続が強制的に切断される
3 を設定(2 回 NG になると接続を遮断する)
MaxAuthTries 3
LoginGraceTime
ここで指定された時間内にログインが出来なければ、接続が強制的に遮断
30 秒に変更
LoginGraceTime 30
AllowUsers / DenyUsers
SSH を利用するユーザが限定的な場合は、 AllowUsers に許可するユーザだけを設定する
- ミスると接続できなくなるので注意
test01, test02 だけ接続を許可
AllowUsers test01 test02
test01 であり 192.168.10.10 からの接続のみ許可
AllowUsers test01@192.168.10.10
192.168.10.10 からの接続のみ許可
AllowUsers *@192.168.10.10
とある SFTP ユーザだけパスワード認証を許可する & 通常は鍵認証しか通してないけど、とあるユーザはパスワード認証したい
# vim /etc/ssh/sshd_config Subsystem sftp internal-sftp Match User sftpusername ChrootDirectory /home/%u PasswordAuthentication yes
- ChrootDirectory の所有者は root にし、root 以外の書き込みが出来ないようにしないといけない
- /home/sftpusername 配下には作れず、/home/sftpusername/a 配下などには作成できる
- ChrootDirectory の所有者は root にし、root 以外の書き込みが出来ないようにしないといけない
TCP Wrapper
TCP Wrapper でホスト単位のアクセス制御が可能
/etc/hosts.deny
全拒否
ALL: ALL
/etc/hosts.allow
192.168.11.2 ならびに *.example.com からの接続を許可
sshd: 192.168.11.2 *.example.com