web-dev-qa-db-ja.com

Linux ssh:ユーザーに秘密鍵の読み取り権限を与えずに公開鍵認証を許可する

Linuxサーバーにログインしているユーザーは、デフォルトのアカウントで特定のリモートマシンにsshできるはずです。リモートマシンの認証には公開鍵が使用されるため、サーバーでは対応する秘密鍵を使用できます。

サーバーユーザーが実際に秘密キーを読み取れるようにしたくありません。基本的に、ユーザーがサーバーにアクセスできるという事実は、ssh権限を許可し、サーバーからそれらを削除すると、リモートマシンへの接続も禁止されます。

ユーザーに秘密鍵への読み取りアクセス権を付与せずにssh接続を開くことを許可するにはどうすればよいですか?

これまでの私の考え:明らかにssh実行可能ファイルは秘密鍵を読み取ることができる必要があるため、それらの権限を持つサーバー上の別のユーザーの下で実行する必要があります。 ssh接続が確立されたら、それをユーザーに「転送」して、ユーザーがコマンドを入力してリモートマシンとやり取りできるようにします。

  • これは良いアプローチですか?
  • フォワードをどのように実装すればよいですか?
  • ユーザーはどのように接続を開始できますか(つまり、キーの読み取り権限を持つユーザーによるSSHの実行)?
  • セキュリティの抜け穴はありますか? -ユーザーが別のユーザーとしてsshを実行できる場合、他のユーザーができることすべて(秘密鍵の読み取りを含む)を実行できますか?
14
Philipp

これが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は正しい引数を使用することにかなりうるさいため、ユーザーの便宜のためにエイリアスまたはラッパースクリプトを設定する可能性があります。

31
HBruijn

これは、ホストベースの認証の良いユースケースのようです。これは、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を変更できることです。別のユーザーとしてリモートマシンにログインできるようにするためにできることは何もありませんが、自分や他のユーザーのリモートマシンへのアクセスを遮断できます。これが問題になる場合は、.shostsrootか何かでのみ書き込み可能にすることができます。これが機能するかどうかはわかりませんが、試して確認することはできます。 (ユーザーが常に~/.ssh/authorized_keysを削除できるため、Sudoを使用するような他の方法も同じリスクの影響を受けます。)

10
David Z