要塞サーバーBがあります。秘密鍵を使用して、AからBを介してCにSSHで接続する必要があります。
より良いオプションは何ですか:
プライベートSSHキーをサーバーに配置しますB.実稼働環境でこれを行うのは悪い考えです。
ここ から:
SSH秘密鍵を踏み台インスタンスに配置しないでください。代わりに、SSHエージェント転送を使用して、最初に要塞に接続し、そこからプライベートサブネット内の他のインスタンスに接続します。これにより、SSH秘密鍵をコンピューター上だけに保持できます。
SSHエージェント転送を使用します。エージェント転送を設定するには、TCP転送を許可する必要があります。エージェント転送を設定すると、転送ホストにソケットファイルが作成されます。これは、キーを宛先に転送できるメカニズムです。 AWSの要塞設定で:
TCP転送:この値をtrueに設定すると、TCP転送(SSHトンネリング)が有効になります。これは非常に便利ですが、セキュリティ上のリスクもあるため、必要でない限り、デフォルト(無効)の設定を維持することをお勧めします。
また here から:
有害と見なされるSSHエージェント転送
何が良いですか? 2番目のリンクの代替についてはどうですか:ProxyCommand、それはソケットファイルの問題に役立つことを理解していますが、それでもTCP転送なので、十分に安全ですか?
私はProxyCommand
を使用することをお勧めします(構文は簡単ですが、クライアント側でopenssh 7.3+を必要とするため、ProxyJump
を使用することをお勧めします)。また、秘密鍵をクライアントにデプロイする必要はありません。要塞、すべてがローカルのままです。
クライアントコンピューターで、~/.ssh/config
の下に次のような内容のファイルを書き込みます。
Host bastion
HostName bastion.example.com
User bastion-user
Port 22
IdentityFile ~/.ssh/id_bastion
Host srvC
HostName srvC.local
User server-user
IdentityFile ~/.ssh/id_protected_lan
ProxyJump bastion
次にssh srvC
を実行すると、エージェント転送や要塞への秘密鍵のデプロイなしで、B(要塞)を介してCに接続します。
上記の例では、「bastion」はバスティオンホストのエイリアスで、srvCはサーバーCのエイリアスです。HostName
には、ホストのIPまたは実際の完全修飾ドメイン名を入力する必要があります。ユーザーの場合、User
を更新して、要塞とサーバーCの正しいログイン名を取得する必要があります。ローカルエージェント(KeeAgentやssh-agentなど)を使用する場合、IdentityFile
はオプションです。 )、ただし実行されていない場合も機能し、各キーパスフレーズを要求します。
もちろん、publicキーを要塞とsrvCの両方にデプロイする必要があります。使用できます($記号はプロンプトを説明するためのものであり、入力しないでください)。
$ ssh-copy-id -i ~/.ssh/id_bastion.pub \
-o PreferredAuthentications=password \
-o PubkeyAuthentication=no \
bastion
$ ssh-copy-id -i ~/.ssh/id_protected_lan.pub \
-o PreferredAuthentications=password \
-o PubkeyAuthentication=no \
srvC
注:上記は、パスワード認証が引き続き許可されている場合にのみ機能します。上記の展開とすべてが意図したとおりに機能することを確認したら、2台のサーバーでのパスワード認証を禁止する必要があります。
(クライアント側で)ProxyJump
をサポートしない古いバージョンのOpenSSHを使用している場合は、以下を置き換えます。
ProxyJump bastion
沿って
ProxyCommand ssh -q -W %h:%p bastion
私が理解している限り、これは似ています。
ProxyJumpに関する答えを見ました。 ProxyCommandについて話しましょう。
しかし、待って、待ってください!私はあなたに書くことができますサーバーをハックする方法エージェント転送を使用するので、違いを理解するのがはるかに簡単です!
基本的な手順については、私の投稿を読むことができます ここ
基本的な手順は次のとおりです。
-〜/ .ssh/configに設定を作成
Host bast
Hostname BASTION_IP
ForwardAgent yes
User bastion
-認証キーをssh-agentに追加します
ssh-add ~/.ssh/name_rsa
-要塞ホスに接続
ssh bast
-要塞からアプリケーションサーバーを接続する
ssh app@IP -p PORT
あなたは、まあ、私に質問をするかもしれません:
サーバーは安全ですか?そして答えは非常に簡単です:
どうして?
そして、問題はどこにありますか?
どうして?
/ tmpディレクトリには、次のようなものがあります。
[root@localhost tmp]# ll
total 12
drwx------ 2 bastion bastion 4096 Sep 7 17:35 ssh-mKX88v0Vlo
一時ファイルを開いてみましょう
[root@localhost tmp]# cd ssh-mKX88v0Vlo/
[root@localhost ssh-mKX88v0Vlo]# ll
total 0
srwxr-xr-x 1 bastion bastion 0 Sep 7 17:35 agent.10507
このプロセスIDにconnectionsを見てみましょう。
netstat -nxp | grep 10507
結果:
unix [ ] STREAM CONNECTED 501384 10507/sshd: bastion
および誰が接続していますか?
lsof -i -a -p 10507
結果:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 10507 bastion 3u IPv4 501301 0t0 TCP *IP*:ssh->*IP*:8279 (ESTABLISHED)
ソケットファイルも確認できます。
cd /proc/10507/fd/
ls
結果:
lrwx------ 1 root root 64 Sep 7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep 7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep 7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep 7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep 7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep 7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep 7 17:46 9 -> socket:[502080]
そして何が起こるかクライアント接続されるときリモートサーバーに?どれどれ:
lrwx------ 1 root root 64 Sep 7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:48 11 -> socket:[502267]
lrwx------ 1 root root 64 Sep 7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep 7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep 7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep 7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep 7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep 7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep 7 17:46 9 -> socket:[502080]
Netstatを使用してソケットファイルが使用されているかどうかを確認することもできます。
unix 3 [ ] STREAM CONNECTED 502267 10561/sshd:
bastion /tmp/ssh-oVoMXC6vb8/agent.10561
unix 3 [ ] STREAM CONNECTED 502072 10561/sshd: bastion
次に、要塞ホストのセッションがopenのときにソケット情報を盗む必要があります。また、宛先サーバーのIPも必要なので、netstatを使用します。
netstat -tn
最終ステップ使用転送されたソケットファイル
eval "$(ssh-agent -s)"
SSH_AUTH_SOCK=/tmp/ssh-EAKxOdL4fl/agent.10507
キーが読み込まれているかどうかを確認。
ssh-add -l
結果は何かであるはずですそのような:
2048 SHA256:2Psdl..B5KQ /home/usr/.ssh/name_rsa (RSA)
Host app
Hostname *.*.*.*
IdentityFile ~/.ssh/your_rsa
User *******
Port ****
ProxyCommand ssh -W %h:%p bast
Host bast
Hostname *.*.*.*
ForwardAgent no
User ******
基本的な操作:サーバーを介してファイルを転送する方法(クライアントからサーバー、サーバーからクライアント)、私の投稿で読むことができます here
結論
詳細については、my blog を参照してください。さらに、私はいくつかのスクリーンショットを持っているので、あなたに役立つかもしれません。
SSHエージェントフォワーディングを使用するだけで、他のほとんどの人がそうです。
利点:悪用される可能性がある要塞に保存されているキーがない。
それが役に立てば幸い:)