Linuxサーバーにログインしているユーザーは、デフォルトのアカウントで特定のリモートマシンにsshできるはずです。リモートマシンの認証には公開鍵が使用されるため、サーバーでは対応する秘密鍵を使用できます。
サーバーユーザーが実際に秘密キーを読み取れるようにしたくありません。基本的に、ユーザーがサーバーにアクセスできるという事実は、ssh権限を許可し、サーバーからそれらを削除すると、リモートマシンへの接続も禁止されます。
ユーザーに秘密鍵への読み取りアクセス権を付与せずにssh接続を開くことを許可するにはどうすればよいですか?
これまでの私の考え:明らかにssh実行可能ファイルは秘密鍵を読み取ることができる必要があるため、それらの権限を持つサーバー上の別のユーザーの下で実行する必要があります。 ssh接続が確立されたら、それをユーザーに「転送」して、ユーザーがコマンドを入力してリモートマシンとやり取りできるようにします。
これがSudo
が存在する理由の1つです。承認済みのコマンドラインオプションのみを使用して、ユーザーが1つのコマンドを実行できるようにするだけで、最も明らかな回避策が解決されます。例えば.
#/etc/sudoers
%users ALL = (some_uid) NOPASSWD: /usr/bin/ssh -i /home/some_uid/.ssh/remote-Host.key username@remotehost
Sudo
を設定して、グループのすべてのメンバーusers
が実行時に自分のパスワード(またはsome_uidアカウントのパスワード)を入力しなくても、ユーザーsome_uidとしてsshコマンドを実行できるようにします。
Sudo -u some_uid /usr/bin/ssh -i /home/some_uid/.ssh/remote-Host.key username@remotehost
NOPASSWD:
オプションを削除して、リモートホストにログインする前にユーザーが自分のパスワードを入力するように強制します。Sudo
は正しい引数を使用することにかなりうるさいため、ユーザーの便宜のためにエイリアスまたはラッパースクリプトを設定する可能性があります。
これは、ホストベースの認証の良いユースケースのようです。これは、SSHがローカルマシン(この場合はサーバー)上の個々のserのキーを使用して認証を行わない認証方法です。代わりに、それはHostの秘密鍵を使用します。これは、/etc/ssh/
に格納されており、root
によってのみ読み取り可能です。
これを設定するには、リモートマシンの.shosts
という名前のファイルを、(~/.ssh
ではなく)ログインするユーザーのホームディレクトリに作成する必要があります。ファイルには内容が必要です
server-hostname +
ここで、server-hostname
はサーバーの名前、+
は「任意のユーザー」を意味するワイルドカードとして機能するリテラルプラス記号です。
また、リモートマシンがサーバーのホストキーを検証できることを確認する必要があります。つまり、サーバーのホストキーは、リモートマシンの/etc/ssh/ssh_known_hosts
または~/.ssh/known_hosts
にリストされている必要があります。これがまだ当てはまらない場合は、リモートマシンにログインして実行することで設定できます。
ssh-keyscan server-hostname >> /etc/ssh/ssh_known/hosts
これらの手順を設定したら、他に何も必要ない場合は、サーバー上の秘密鍵を完全に削除できます。 (もしそうなら、いつでもroot
か何かでしか読めないように設定できます。)
また、リモートマシンへの特定のユーザーのアクセスを許可または拒否するなどの操作を簡単に実行できます。詳細については、ssh
およびhosts.equiv
のマニュアルページを参照してください。
このセットアップの1つの問題は、リモートマシンにログインするユーザーが.shosts
を変更できることです。別のユーザーとしてリモートマシンにログインできるようにするためにできることは何もありませんが、自分や他のユーザーのリモートマシンへのアクセスを遮断できます。これが問題になる場合は、.shosts
をroot
か何かでのみ書き込み可能にすることができます。これが機能するかどうかはわかりませんが、試して確認することはできます。 (ユーザーが常に~/.ssh/authorized_keys
を削除できるため、Sudo
を使用するような他の方法も同じリスクの影響を受けます。)