内部ネットワークにサーバーがあり (VPN 経由でログイン)、そこから OpenSSH 公開/秘密キー認証を使用して SSH 経由でサーバーにログインします。セキュリティの観点から、使用している 3 つのクライアントの MAC アドレスをiptables
サーバーに関連付けて、これらのクライアントだけがログインできるようにしたいと考えています。
iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source xx:xx:xx:xx:xx:xx -j ACCEPT
iptables -A INPUT -p tcp --destination-port 22 -j DROP
しかし、この方法で行うことをお勧めしますか? 使用されているクライアントに SSH ログインを関連付けるには、他にどのような (より良い) 方法を使用できますか?
(2FA をリクエストしたい場合、残念ながら 2FA は潜在的な解決策として利用できません。)
ありがとう。
答え1
信頼できないホストが有効なユーザー資格情報を提供している場合でも、SSH サーバーがそれらのホストからの接続を受け入れないようにしたいとお考えですか。これは正しいですか?
ユーザーの公開鍵認証を選択したクライアント ホストに結び付けるための可能なソリューションは、ホスト ベース認証を使用することです。ホスト ベース認証を設定し、次のいずれかのAuthenticationMethods
パラメータを定義します/etc/ssh/sshd_config
。
AuthenticationMethods hostbased,publickey hostbased,keyboard-interactive hostbased,password
または:
AuthenticationMethods hostbased,publickey
これにより、SSH デーモンは、ユーザーのキーまたはパスワードを確認する前に、クライアントが接続しているホストを認証するように要求します。前者の選択肢はパスワードベースの認証を許可しますが、後者は公開キーのみに制限します。ホストベースの認証はキーペアに基づいているため、SSH サーバーは動的 IP アドレスを持つクライアントを認証できます。
完全な手順は次のとおりです。SSHがホストベースの認証を実行する方法についてのドキュメントは、ssh(1)
マニュアルページSSH がユーザーを識別する方法に注意し、それが自分のケースに当てはまるかどうかを確認してください。
ホストベースの認証は次のように機能します。ユーザーがログインするマシンがリモートマシンに
/etc/hosts.equiv
リストされている場合、/etc/ssh/shosts.equiv
ユーザー名は両側で同じです、またはファイル~/.rhosts
またはが~/.shosts
リモートマシン上のユーザーのホームディレクトリに存在し、クライアントマシンの名前とそのマシン上のユーザー名を含む行を含む、ユーザーはログイン対象とみなされます。さらに、ログインを許可するには、サーバーがクライアントのホスト キーを検証できる必要があります。この認証方法は、IP スプーフィング、DNS スプーフィング、ルーティング スプーフィングによるセキュリティ ホールを塞ぎます。[管理者への注意: 、、/etc/hosts.equiv
および~/.rhosts
rlogin/rsh プロトコル全般は、本質的に安全ではないため、セキュリティが必要な場合は無効にする必要があります。]
OpenSSH でホストベースの認証を有効にするには:
- 以下のパラメータ値を設定します
/etc/ssh/sshd_config
:
# /etc/ssh/sshd_config
HostbasedAuthentication yes
IgnoreUserKnownHosts yes
IgnoreRhosts yes
# AuthenticationMethods hostbased,publickey hostbased,keyboard-interactive hostbased,password
AuthenticationMethods hostbased,publickey
- ホストベースの認証を実行するには、クライアントが提供するホスト名情報を信頼するために
HostbasedUsesNameFromPacketOnly yes
、/etc/ssh/sshd_config
:
# /etc/ssh/sshd_config
HostbasedUsesNameFromPacketOnly yes
- または、
/etc/hosts
ネットワークの DNS サーバーのファイルまたは PTR レコードに保存されている情報を使用して、クライアントの IP アドレスを解決し、ホスト名を識別するように SSH デーモンを構成することもできます。
# /etc/ssh/sshd_config
HostbasedUsesNameFromPacketOnly no
UseDNS yes
- ファイルに許可されたクライアントのホスト名をリストします
/etc/ssh/shosts.equiv
。存在しない場合は手動で作成します。ファイルの構文は、man ホスト.equiv(5)、 しかしSSHデーモンは空のホスト名を受け入れません。
# /etc/ssh/shosts.equiv
ssh-client-alpha
ssh-client-bravo
ssh-client-charlie
- ファイルに許可されたホストの公開鍵をリストします
/etc/ssh/ssh_known_hosts
。これを行う便利な方法は、ssh-keyscan
:
[root@ssh-server ~]# ssh-keyscan ssh-client-alpha >> /etc/ssh/ssh_known_hosts
[root@ssh-server ~]# ssh-keyscan ssh-client-bravo >> /etc/ssh/ssh_known_hosts
[root@ssh-server ~]# ssh-keyscan ssh-client-charlie >> /etc/ssh/ssh_known_hosts
OpenSSH サーバーがホストベースの認証要求を受け入れるように構成した後、クライアントもホストベースの認証を要求するように構成する必要があります。
- 以下のパラメータ値を設定します
/etc/ssh/ssh_config
:
# /etc/ssh/ssh_config
Host *
HostbasedAuthentication yes
EnableSSHKeySign yes
- SUID/SGIDビットが
ssh-keysign
実行可能ファイルにホストの秘密鍵ファイルへの読み取り権限を付与します。
[root@ssh-client-alpha ~]# find /usr -name ssh-keysign -ls
16517300 616 -r-xr-sr-x 1 root ssh_keys 630344 Feb 4 16:01 /usr/libexec/openssh/ssh-keysign
[root@ssh-client-alpha ~]# ls -l /etc/ssh/ssh_host_*key
-rw-r----- 1 root ssh_keys 480 Apr 13 06:51 /etc/ssh/ssh_host_ecdsa_key
-rw-r----- 1 root ssh_keys 387 Apr 13 06:51 /etc/ssh/ssh_host_ed25519_key
-rw-r----- 1 root ssh_keys 2578 Apr 13 06:51 /etc/ssh/ssh_host_rsa_key