やりたいこと
リモートワークを推進する裏で、SSHのアクセスコントロールをちゃんとしたい。
例えば、本番環境で稼働しているサーバは踏み台を必ず経由したいときなど、あると思います。
SSHポートをiptablesで落とすだけでも良いのですが、その場合なぜユーザがログインできなかったのかの切り分けがやりにくく、開発者が混乱する可能性があると考えました。
そのため、以下の要件を満たせないか考えました。
要件
1. ユーザの接続元とユーザに応じてアクセスをコントロールしたい
* 172.168.10.0/24からのアクセス かつ sshd_userというユーザのアクセスは拒否したい
* それ以外のSSHアクセスは通す
2. アクセスしてきたユーザに対して、なぜログインできないのかを明示したい
環境
sshd serverはインストール済みで稼働しているものとします。
今回使用したOpenSSH ServerのバージョンはOpenSSH_8.1p1
になります。
設定内容
ユーザの接続元とユーザに応じたアクセスコントロール
こちらはよくある設定ですね。
今回は、以下のユーザからのアクセスを制限したいと思います。
- IPアドレス172.168.10.0/24からのアクセスである
- 制限対象のユーザ名は sshd_user とします
接続先サーバのsshd_configに以下のような設定を入れてみましょう。
/etc/ssh/sshd_config
Match Address 172.168.10.* User sshd_user
PasswordAuthentication no
PubkeyAuthentication no
こうすると、SSHのコネクションは貼れますが、認証方式が無いため結果としてログインできません。
でも、これだけならDenyUsers
構文だけでも十分です。
では、今回やりたかったことを実現してみましょう。
ログインできない理由を表示する
以下のサイトに記載されていた情報を参考にしました。
manページ — SSHD_CONFIG
sshd_configの設定項目の理解を目指す
以下のような記載があります。
Banner (バナー)
司法管区によっては、法的な保護を受けるためには 認証の前に警告メッセージを送ったほうがよい場合があります。
ここで指定されたファイルの内容は、認証が許可される前に リモートユーザに提示されます。
このオプションは プロトコル バージョン 2 でのみサポートされています。
デフォルトでは、バナーは表示されません
となっていますので、早速バナーを設定してみましょう。
設定
$ cat << EOF | sudo tee /etc/ssh/banner.txt
********************************************************
*YOU CAN NOT LOGIN TO THIS SERVER FROM YOUR IP ADDRESS.*
********************************************************
EOF
$ sudo chmod 644 /etc/ssh/banner.txt
### 先程の設定を編集しましょう。
$ sudo vim /etc/ssh/sshd_config
Match Address 172.168.10.* User sshd_user
Banner /etc/ssh/banner.txt
PasswordAuthentication no
PubkeyAuthentication no
$ sudo systemctl restart sshd.service
この状態で接続すると以下のように表示されます。
% ssh <上記のSSHの設定したサーバ>
********************************************************
*YOU CAN NOT LOGIN TO THIS SERVER FROM YOUR IP ADDRESS.*
********************************************************
sshd_user@<上記のSSHの設定したサーバ>'s password:
Received disconnect from 上記のSSHの設定したサーバ> port 22:2: Too many authentication failures
Disconnected from 上記のSSHの設定したサーバ> port 22
というわけで、要件は満たせました。