内部ネットワーク(VPN経由でログイン)にサーバーがあり、そこからOpenSSH公開/秘密鍵認証を使用してSSH経由でサーバーにログインします。セキュリティの観点から、私はiptables
私が使用した3つのクライアントのMACアドレスをサーバーを介してバインドし、そのクライアントだけがそれを使用してログインできるようにしたいと思います。
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サーバーが信頼できないホストからの接続を受け入れないようにしたいとします。これは正しいですか?
ユーザの公開鍵認証を選択されたクライアントホストに接続する1つの可能な解決策は、ホストベースの認証を利用することである。ホストベースの認証を設定し、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
ファイルに承認されたクライアントのホスト名を一覧表示します。存在しない場合は手動で作成します。このファイルの構文は、次に説明する構文とほぼ同じです。人間ホスト.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