リモートサーバにログインするときに利用するSSHクライアントのコマンドになります。SSHはSecure Shellの略で、2つのホスト間で安全な暗号化通信を確立できます。
また、sshコマンドと組み合わせて利用するコマンドやプログラムがいくつかあります。例えば、sshコマンドで利用するための秘密鍵と公開鍵を生成するために、ssh-keygenコマンドが利用できます。また、パスワード入力を省略するためのプログラムとしてssh-agentがあります。
目次
鍵の作成とその配送手段の例
sshコマンドでは基本的に秘密鍵(secret key)と公開鍵(public key)を利用して、リモートサーバにログインすることが多いです。なので、まず、鍵の作成方法とその配送手段の例について説明します。
鍵の配送手段を検討
鍵の配送手段はいくつかの方法が考えられます。USBメモリ等で公開鍵を物理的に配送する方法やSSHでとりあえずパスワード認証で入れるようにしておいて公開鍵を転送する方法、既に作成済みの秘密鍵と公開鍵を用いて別の公開鍵を転送する方法などがあります。
ここでは、サーバ側へパスワード認証で公開鍵を転送する方法を想定します。
そのためにサーバ側にパスワード認証で入ることができるかを確認します。
sshコマンドの簡単な使い方
1 |
ssh <ユーザ名>@<ホスト名またはIPアドレス> |
初回接続の場合は、接続先が正しいかどうかを尋ねられます。基本的にここはyesを選択し、次にサーバ側のログインパスワードを入力することでリモートサーバにログインができます。また、ログアウトを行う場合はexitコマンドでログアウトできます。
実際の例
1 2 3 4 5 6 7 8 |
ubuntu@ubuntu-VirtualBox:~$ ssh [email protected] The authenticity of host '10.0.2.5 (10.0.2.5)' can't be established. ECDSA key fingerprint is SHA256:gsx1+kjncjD7QBBraSFzTGBXdCIAB6mjurDbovwOJd8. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.0.2.5' (ECDSA) to the list of known hosts. [email protected]'s password: Last login: Fri Nov 13 11:17:10 2020 from 10.0.2.6 s1user1@sshtest:~$ |
2回目以降の接続の場合、接続先が正しいかどうかは尋ねられません。サーバ側のログインパスワードだけで入ることができます。
1 2 3 4 |
ubuntu@ubuntu-VirtualBox:~$ ssh [email protected] [email protected]'s password: Last login: Sat Nov 14 12:36:33 2020 from 10.0.2.6 s1user1@sshtest:~$ |
補足として、ホスト名やIPアドレスがなりすましで実際の接続先と異なる可能性があるため、接続が初回の場合はフィンガープリント(fingerprint)で接続先が本当に正しいかどうかが尋ねられます。
1 2 3 4 5 6 7 8 |
ubuntu@ubuntu-VirtualBox:~$ ssh [email protected] The authenticity of host '10.0.2.5 (10.0.2.5)' can't be established. ECDSA key fingerprint is SHA256:gsx1+kjncjD7QBBraSFzTGBXdCIAB6mjurDbovwOJd8. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.0.2.5' (ECDSA) to the list of known hosts. [email protected]'s password: Last login: Fri Nov 13 11:17:10 2020 from 10.0.2.6 s1user1@sshtest:~$ |
このフィンガープリントは、サーバ側から渡される公開鍵になります。確認する例としては、サーバ側の/etc/ssh/<鍵の種類>.pubにいくつかのフィンガープリントで渡される公開鍵があり、ssh-keygenコマンドでフィンガープリントを表示させる方法があります。
ここでは、パスワード認証でEDCSAの公開鍵のフィンガープリントが渡されているので、その確認を行います。
1 2 3 4 5 6 7 |
s1user1@sshtest:~$ ls -l /etc/ssh/*.pub -rw-r--r-- 1 root root 602 Nov 11 05:03 /etc/ssh/ssh_host_dsa_key.pub -rw-r--r-- 1 root root 174 Nov 11 05:03 /etc/ssh/ssh_host_ecdsa_key.pub -rw-r--r-- 1 root root 94 Nov 11 05:03 /etc/ssh/ssh_host_ed25519_key.pub -rw-r--r-- 1 root root 394 Nov 11 05:03 /etc/ssh/ssh_host_rsa_key.pub s1user1@sshtest:~$ ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key.pub 256 SHA256:gsx1+kjncjD7QBBraSFzTGBXdCIAB6mjurDbovwOJd8 root@sshtest (ECDSA) |
上の初回接続時に尋ねられたフィンガープリントと一緒であることが分かります。このフィンガープリントの仕組みで相手先がなりすましではなく、正しい接続先かどうかが分かります。
また、サーバ側からの公開鍵はクライアント側の~/.ssh/known_hostsに保存されます(接続先が増えていくと追記されます)。
このknown_hostsに書かれている接続先では、フィンガープリントを尋ねられなくなります。ここで、フィンガープリントでknown_hostsを確認してみます。
1 2 3 |
ubuntu@ubuntu-VirtualBox:~$ ssh-keygen -lf ~/.ssh/known_hosts 256 SHA256:gsx1+kjncjD7QBBraSFzTGBXdCIAB6mjurDbovwOJd8 |1|dbpoyjqmGOXWK0q4NDwkESxW2/A=|3Uk7mTIc73wTIy2zKYVF4wuN8qw= (ECDSA) 256 SHA256:rw0AEadXoDI2pya0NrkfPbNGJp1LH5CCypX+F1+jGk8 |1|4tBIAzfwqdrVDEQgJ6qeCYEl+qI=|vQ9ji/VYVHpTulreC/NSOK7ZquU= (ECDSA) |
1行目のフィンガープリントは、上で確認したフィンガープリントと同じと確認できます。
登録してあるフィンガープリントで接続先が違うフィンガープリントの場合、接続ができない場合があるので注意が必要になります。
鍵の作成
ここでは、2048ビットのRSA鍵の作成を行います。ssh-keygenコマンドを用いて、tオプションでrsaを指定することでRSA鍵が作成できます。
1 |
ssh-keygen -t rsa |
尋ねられることは
- 鍵ファイルを保存する場所
- 鍵のパスフレーズ(パスワード)
になります。鍵が作成されると、秘密鍵(ここではid_rsa)と公開鍵(ここではid_rsa.pub)が作成されます。
さらに、あまり意識しなくてもいいですが、フィンガープリントとフィンガープリントを視覚化したrandomartが表示されます。randomartはフィンガープリントを人間が確認したい場合、文字を見るよりもさっと違いが確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/ubuntu/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/ubuntu/.ssh/id_rsa. Your public key has been saved in /home/ubuntu/.ssh/id_rsa.pub. The key fingerprint is: SHA256:cFQamx14dR7akiwn1ZksIv+Nm7Cna1zqrDKnWIVNm1g ubuntu@ubuntu-VirtualBox The key's randomart image is: +---[RSA 2048]----+ | ooo.oooo | | .o*o+.*=. | | . E++.*.o | | O o.+ . | | o S . o | | . . + . | | . . = o | | oo ..= + | | . .=.+=+ | +----[SHA256]-----+ $ |
補足として、ssh-keygenコマンドのlオプションを用いるとフィンガープリントを確認できます。さらにvオプションをつけるとrandomartを表示できます。また、下の例のfオプションはファイルの指定になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ ssh-keygen -lf ~/.ssh/id_rsa.pub 2048 SHA256:cFQamx14dR7akiwn1ZksIv+Nm7Cna1zqrDKnWIVNm1g ubuntu@ubuntu-VirtualBox (RSA) $ ssh-keygen -v -lf ~/.ssh/id_rsa.pub 2048 SHA256:cFQamx14dR7akiwn1ZksIv+Nm7Cna1zqrDKnWIVNm1g ubuntu@ubuntu-VirtualBox (RSA) +---[RSA 2048]----+ | ooo.oooo | | .o*o+.*=. | | . E++.*.o | | O o.+ . | | o S . o | | . . + . | | . . = o | | oo ..= + | | . .=.+=+ | +----[SHA256]-----+ |
公開鍵の転送
公開鍵を転送するコマンドとして、ssh-copy-idコマンドがあります。このコマンドを利用すると指定したホストに簡単に公開鍵を転送することができます。
1 |
ssh-copy-id user@hostname |
実際の例
1 2 3 4 5 6 7 8 9 10 11 |
$ ssh-copy-id [email protected] /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys [email protected]'s password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh '[email protected]'" and check to make sure that only the key(s) you wanted were added. $ |
基本的にはssh-copy-idコマンドの方が簡単ですが、以下の方法でも鍵を転送することもできます(userとhostnameは書き換える必要があります)。
1 |
cat .ssh/id_rsa.pub | ssh user@hostname "cd ; umask 077 ; mkdir -p .ssh && cat >> .ssh/authorized_keys" |
また、このコマンドで、sshで実行されるコマンドの意味は以下のようになります。
- cdコマンドでホームディレクトリに移動
- umaskコマンドでファイル作成の権限のマスクをセット(権限の077の部分(グループと他のユーザの権限)がセットされなくなります。つまり、ファイル作成時の権限は700の部分(自ユーザ)しかセットできなくなります)
- .sshのディレクトリ作成(ディレクトリの作成の権限はumaskの設定が000だと、777になりますが、上のumaskコマンドの設定だと権限は700で作成されます)
- 標準入力にバッファしている内容(id_rsa.pubの内容)を./ssh/authorized_keysに作成または追記(ファイルが作成される場合の権限はumaskの設定が000だと、666になりますが、上のumaskコマンドの設定だと権限は600で作成されます)
実際の例
1 2 3 |
$ cat .ssh/id_rsa.pub | ssh [email protected] "cd ; umask 077 ; mkdir -p .ssh && cat >> .ssh/authorized_keys" [email protected]'s password: $ |
ログインの確認
sshコマンドを実行するとき、デフォルトでは、秘密鍵として、~/.ssh/id_rsa,~/.ssh/id_ecdsa等が指定されます。
ここでのパスワードはログイン時のパスワードではなく、鍵を作成したときのパスワードを入力します。
別の秘密鍵のファイルを指定したい場合は-iオプションで指定します。
1 2 3 4 |
$ ssh [email protected] Enter passphrase for key '/home/ubuntu/.ssh/id_rsa': Last login: Fri Nov 20 08:41:44 2020 from 10.0.2.6 s1user1@sshtest:~$ |
簡単なまとめ
鍵の作成からログインの確認までの必要なコマンドのみを記述すると以下のようになります。鍵ファイルの保存場所をデフォルトのまま利用していますが、鍵の保存場所を変更したい場合でもコマンドにオプションがつけられるだけで、概ね以下のような流れになります。
1 2 3 4 5 |
$ ssh-keygen -t rsa (ssh-keygenコマンドの出力内容と入力内容は省略) $ ssh-copy-id <ユーザ名>@<ホスト名> (ssh-copy-idコマンドの出力内容は省略) $ ssh <ユーザ名>@<ホスト名> |
指定する鍵ファイルを変更したい場合(例として鍵ファイルは秘密鍵が~/.ssh/testkeyで、公開鍵は~/.ssh/testkey.pubとした場合)
1 2 3 4 5 |
$ ssh-keygen -t rsa -f ~/.ssh/testkey (ssh-keygenコマンドの出力内容と入力内容は省略) $ ssh-copy-id -i ~/.ssh/testkey.pub <ユーザ名>@<ホスト名> (ssh-copy-idコマンドの出力内容と入力内容は省略) $ ssh -i ~/.ssh/testkey <ユーザ名>@<ホスト名> |
sshコマンドの利用
sshコマンドでログイン
sshコマンドで引数に"ユーザ名@ホスト名"を指定すると、リモートサーバを対話的に操作するためのシェルが起動されます(ユーザ名は-lオプションで指定も可)。
1 2 |
ssh ユーザ名@ホスト名 ssh -l ユーザ名 ホスト名 |
コマンド例
1 2 3 4 |
$ ssh [email protected] Enter passphrase for key '/home/ubuntu/.ssh/id_rsa': Last login: Mon Jan 4 12:24:50 2021 from 10.0.2.6 s1user1@sshtest:~$ |
また、ユーザを省略すると、sshクライアントを起動しているユーザ名が指定されます。ここではCtrl+Cでログインを中止しています。
1 2 3 4 5 6 |
ポート番号を指定したい場合は、-pオプションを利用できます。ポート番号の指定がない場合は、デフォルトで22番ポートが指定されます
1 2 3 4 |
$ ssh -p 50022 [email protected] Enter passphrase for key '/home/ubuntu/.ssh/id_rsa': Last login: Mon Jan 4 12:37:24 2021 from 10.0.2.6 s1user1@sshtest:~$ |
シェルを起動せずにコマンドを実行
リモートサーバで特定のコマンドを実行したい場合は、sshコマンドのホストの後に、そのままコマンドを記述すると、その内容がリモートサーバで実行され、出力を返してくれます。
下の例では、ssh-agentを利用して、事前に鍵のパスワードを登録してから、コマンドを実行しています。
1 2 3 4 5 |
$ ssh-add Enter passphrase for /home/ubuntu/.ssh/id_rsa: Identity added: /home/ubuntu/.ssh/id_rsa (/home/ubuntu/.ssh/id_rsa) $ ssh [email protected] 'echo "user:${USER} info: $SSH_CONNECTION"' user:s1user1 info: 10.0.2.6 36460 10.0.2.5 22 |
USERとSSH_CONNECTIONはsshを利用するときに設定される環境変数になります。
- USER: ログインするユーザ名
- SSH_CONNECTION: クライアント側のIPアドレスとポート番号、サーバ側のIPアドレスとポート番号(スペース区切り)
踏み台サーバを経由して目的サーバまでのsshログイン
踏み台サーバを経由して目的サーバまでのsshログインの方法にはいくつかあります。
ここでは、ローカルマシン、踏み台サーバ(step server)、目的サーバ(target server)の3つのマシンがあることを前提に説明します。
また、ローカルマシンから踏み台サーバを経由して、目的サーバに公開鍵を渡す方法は様々な方法がありますが、ここでは、-Jオプションを利用したものと、-oオプションのproxycommandを利用したものを紹介します。また、踏み台サーバには既にローカルマシンの公開鍵を渡している前提とします。
コマンドの例を分かりやすくするために、踏み台サーバのホスト名を変数stepserver、目的サーバにはホスト名を変数targetserverに入れています。
-Jオプション(OpenSSH7.3以降)を利用する場合
下の例で入力しているパスワードは、踏み台サーバの鍵のパスワード、目的サーバのユーザにログインするためのパスワード(鍵をまだ渡していないため)になります。
1 2 3 4 5 6 |
$ stepserver=10.0.2.5 $ targetserver=192.168.0.102 $ cat .ssh/id_rsa.pub | ssh -J s1user1@$stepserver s2user1@$targetserver "cd ; umask 077 ; mkdir -p .ssh && cat >> .ssh/authorized_keys" Enter passphrase for key '/home/ubuntu/.ssh/id_rsa': [email protected]'s password: $ |
sshコマンドの-oオプションのproxycommandを利用する場合
変数やパスワード入力は上の-Jオプションの時と同様になります。
1 2 3 4 |
$ cat .ssh/id_rsa.pub | ssh -o proxycommand="ssh -W %h:%p s1user1@$stepserver" s2user1@$targetserver "cd ; umask 077 ; mkdir -p .ssh && cat >> .ssh/authorized_keys" Enter passphrase for key '/home/ubuntu/.ssh/id_rsa': [email protected]'s password: $ |
ログインする方法も同様に-Jオプションを利用した場合と、-oオプションのproxycommandを利用したものを紹介します。
-Jオプションを利用する場合
1 2 3 4 5 |
$ ssh -J s1user1@$stepserver s2user1@$targetserver Enter passphrase for key '/home/ubuntu/.ssh/id_rsa': Enter passphrase for key '/home/ubuntu/.ssh/id_rsa': Last login: Sat Dec 19 17:44:55 2020 from 192.168.0.101 s2user1@sshtest:~$ |
sshコマンドの-oオプションのproxycommandを利用する場合
1 2 3 4 5 |
$ ssh -o proxycommand="ssh -W %h:%p s1user1@$stepserver" s2user1@$targetserver Enter passphrase for key '/home/ubuntu/.ssh/id_rsa': Enter passphrase for key '/home/ubuntu/.ssh/id_rsa': Last login: Sat Dec 19 17:51:37 2020 from 192.168.0.101 s2user1@sshtest:~$ |
パスワードが面倒な場合はssh-agentを用いると楽になります。
1 2 3 4 5 6 |
$ ssh-add Enter passphrase for /home/ubuntu/.ssh/id_rsa: Identity added: /home/ubuntu/.ssh/id_rsa (/home/ubuntu/.ssh/id_rsa) $ ssh -J s1user1@$stepserver s2user1@$targetserver Last login: Sat Dec 19 17:49:36 2020 from 192.168.0.101 s2user1@sshtest:~$ |
また、ssh_configを用いるとコマンドが短縮できます。ここでは、ProxyJumpのキーワードを用いた場合とProxyCommandのキーワードを用いた場合を紹介します。踏み台サーバは10.0.2.5で、目的サーバは192.168.0.102になります。
ProxyJumpを用いる場合
~/.ssh/config
1 2 3 4 |
コマンド例
1 2 3 4 5 |
$ ssh targetserver Enter passphrase for key '/home/ubuntu/.ssh/id_rsa': Enter passphrase for key '/home/ubuntu/.ssh/id_rsa': Last login: Sat Dec 19 17:52:16 2020 from 192.168.0.101 s2user1@sshtest:~$ |
ProxyCommandを用いる場合(sshクライアントのバージョンが古くて、ProxyJumpが利用できない場合に利用できます)
~/.ssh/config
1 2 3 4 5 6 7 8 |
Host targetserver HostName 192.168.0.102 User s2user1 ProxyCommand ssh -W %h:%p stepserver Host stepserver HostName 10.0.2.5 User s1user1 |
コマンド例
1 2 3 4 5 |
$ ssh targetserver Enter passphrase for key '/home/ubuntu/.ssh/id_rsa': Enter passphrase for key '/home/ubuntu/.ssh/id_rsa': Last login: Sat Dec 19 18:26:57 2020 from 192.168.0.101 s2user1@sshtest:~$ |
ssh-agentコマンドとssh-addコマンド
ssh-agentは作業を行う際に、鍵認証でのパスワード入力を一回入力することで以降のパスワード入力を省略できるようにするプログラムです。ssh-agentはUnixドメインソケットを利用して、SSHクライアントと通信をし、ユーザの代わりにパスワード入力を行います。
ssh-addコマンドはssh-agentに秘密鍵をプログラムメモリ上に登録するコマンドで、このコマンドで登録した秘密鍵を用いるSSHログインをするとき、パスワード入力の作業を省略することができます。
ssh-agentは便利なプログラムですが、セキュリティ上にもいくつか問題はあります。例えば、カレントユーザしか読み取れないssh-agentのUnixドメインソケットがルートユーザやその同じユーザのプログラムインスタンスによって悪用される可能性や、実世界でssh-agentを使用しているマシンを意図しないユーザが操作し簡単にリモートサーバにログインできてしまう点は注意が必要です。
ssh-agentの起動
ssh-agentを利用したいときに起動する前に一度、ssh-agentが起動していないことを確認してみても良いでしょう。ssh-agentに関係する環境変数はSSH_AGENT_PIDとSSH_AUTH_SOCKで例えば、envコマンドで環境変数を確認すると
1 2 3 4 |
$ env | grep SSH SSH_AGENT_PID=4504 SSH_AGENT_LAUNCHER=upstart SSH_AUTH_SOCK=/tmp/ssh-Zt5CNCWLlTyu/agent.4503 |
上のように設定されている場合があります。例えば、これは、ssh-agentが自動起動に設定されている場合がある例となります。
上のように環境変数が設定されていない場合は、ssh-agentコマンドを実行してssh-agentを起動します。起動の仕方は少し変わっていて、evalコマンドを通して、実行します。
1 |
eval $(ssh-agent) |
または、バッククォートを利用して
1 |
eval `ssh-agent` |
実行させます。
理由としてはssh-agentコマンドが以下のような出力を行うためです。
補足(これは実行しないでください)
1 2 3 4 |
$ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-cGK6uTn3vUti/agent.4490; export SSH_AUTH_SOCK; SSH_AGENT_PID=4491; export SSH_AGENT_PID; echo Agent pid 4491; |
ssh-agentコマンドをevalコマンドを通して実行することによって、ssh-agentを起動させ、同時に環境変数も設定することができます。
鍵の登録とssh-agentが利用されたSSHログイン
ssh-addコマンドを利用することでssh-agentの鍵の登録を行うことができます。鍵の登録時にパスワードを尋ねられ、入力することで登録は完了し、SSHログインを行うときにパスワード入力を省略することができます。
1 |
ssh-add <秘密鍵のパス> |
また、引数を省略すると、
* ~/.ssh/id_rsa
* ~/.ssh/id_dsa
* ~/.ssh/id_ecdsa
* ~/.ssh/id_ed25519
* ~/.ssh/identity
のファイルに対して、ssh-addコマンドが実行されます。
ssh-agentを利用しない場合と利用した場合のログイン例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ ssh [email protected] Enter passphrase for key '/home/ubuntu/.ssh/id_rsa': Last login: Mon Dec 7 17:10:43 2020 from 10.0.2.6 s1user1@sshtest:~$ exit logout Connection to 10.0.2.5 closed. $ $ ssh-add Enter passphrase for /home/ubuntu/.ssh/id_rsa: Identity added: /home/ubuntu/.ssh/id_rsa (/home/ubuntu/.ssh/id_rsa) $ ssh [email protected] Last login: Tue Dec 8 07:46:24 2020 from 10.0.2.6 s1user1@sshtest:~$ |
時間制限付きで鍵の登録
ssh-addの-tオプションを用いることで鍵の登録期間を設定することができます。時間文字列の詳しくはman 5 sshd_config
のTIME FORMATSのセクションに書かれています。
1 2 3 4 5 6 7 8 9 10 11 |
ssh-add -t <時間文字列> <秘密鍵のパス> # 300秒 ssh-add -t 300 <秘密鍵のパス> ssh-add -t 300s <秘密鍵のパス> # 10分 ssh-add -t 10m <秘密鍵のパス> # 2時間30分 ssh-add -t 2h30m <秘密鍵のパス> |
時間文字列は上の例以外では'd'で日、'w'で週になります。
登録されている鍵のFingerprintsの一覧の確認
ssh-addの-lオプションを用いると登録されている鍵のフィンガープリントの一覧を確認できます。
1 2 3 |
$ ssh-add -l 2048 SHA256:cFQamx14dR7akiwn1ZksIv+Nm7Cna1zqrDKnWIVNm1g /home/ubuntu/.ssh/id_rsa (RSA) 2048 SHA256:2ShqwI+HM2yDMydAzKfaJbyB0y1O8g6BbBp9X22S2A8 /home/ubuntu/.ssh/testkey (RSA) |
登録されている鍵の削除
ssh-addの-dオプションを用いると登録されている鍵を登録から削除できます。引数を省略すると~/.ssh/id_rsa, ~/.ssh/id_ecdsa等のファイルが指定されます。
1 |
ssh-add -d <秘密鍵のパス> |
コマンド例
1 2 3 4 |
$ ssh-add -d ~/.ssh/testkey Identity removed: /home/ubuntu/.ssh/testkey (ubuntu@ubuntu-VirtualBox) $ ssh-add -d Identity removed: /home/ubuntu/.ssh/id_rsa (ubuntu@ubuntu-VirtualBox) |
また、-Dオプションを用いると登録している鍵をすべて削除できます。
1 2 |
$ ssh-add -D All identities removed. |
ssh-addコマンドでssh-agentのロックとアンロック
ssh-addコマンドでssh-agentを一時的にロックすることができます。
1 2 3 4 |
# ロックする場合 ssh-add -x # アンロックする場合 ssh-add -X |
コマンド例ではロック時では、ssh-agentが機能せず、鍵のパスワードが聞かれていますが、アンロックするとssh-agentが機能し、鍵のパスワードが聞かれずにログインできます。
コマンド例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$ ssh-add Enter passphrase for /home/ubuntu/.ssh/id_rsa: Identity added: /home/ubuntu/.ssh/id_rsa (/home/ubuntu/.ssh/id_rsa) $ ssh [email protected] Last login: Tue Dec 8 08:06:03 2020 from 10.0.2.6 s1user1@sshtest:~$ exit logout Connection to 10.0.2.5 closed. $ $ ssh-add -x Enter lock password: Again: Agent locked. $ ssh [email protected] Enter passphrase for key '/home/ubuntu/.ssh/id_rsa': $ ssh-add -X Enter lock password: Agent unlocked. $ ssh [email protected] Last login: Tue Dec 8 08:11:59 2020 from 10.0.2.6 s1user1@sshtest:~$ exit logout Connection to 10.0.2.5 closed. |
ssh-agentの終了
ssh-agentを自分で終了させたい場合は以下のように行います。
1 |
eval $(ssh-agent -k) |
または
1 |
eval `ssh-agent -k` |
同様に補足として、ssh-agent -kコマンドは以下のような出力を行います。(上とプロセスIDが異なっていますが、あくまで出力例になります)
補足(これは実行しないでください)
1 2 3 4 |
$ ssh-agent -k unset SSH_AUTH_SOCK; unset SSH_AGENT_PID; echo Agent pid 5796 killed; |
パスワードなしの鍵を作成してログイン
鍵の作成時にパスワードを空にすれば、sshの公開鍵認証でパスワードを入力する必要がなくなります。セキュリティと利便性を考えた上で利用してください。
鍵の作成を行うときにパスワード入力せずにエンターキーのみを入力します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/ubuntu/.ssh/id_rsa): /home/ubuntu/.ssh/id_rsa_nopass Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/ubuntu/.ssh/id_rsa_nopass. Your public key has been saved in /home/ubuntu/.ssh/id_rsa_nopass.pub. The key fingerprint is: SHA256:P6tw/zO2LHNMskOK7h9MVYWbTYEEAGZyjwW1WCezGIE ubuntu@ubuntu-VirtualBox The key's randomart image is: +---[RSA 2048]----+ | ..O=B.ooo+o. | | E= O * .o . | | + + . = | | . o . | | S | | o .o . | | ..+oo= | | .o.o=+* | | oo.o.oB++ | +----[SHA256]-----+ |
次に、鍵の転送を行います。ssh-copy-idコマンドを用いて、-iオプションで公開鍵を指定します。
そして、パスワードを入力し(ここでは公開鍵認証を利用したログインのため、パスワードなしの鍵とは別の鍵作成時のパスワードを入力しています)、鍵を転送します。
1 2 3 4 5 6 7 8 9 10 |
$ ssh-copy-id -i .ssh/id_rsa_nopass.pub [email protected] /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa_nopass.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys Enter passphrase for key '/home/ubuntu/.ssh/id_rsa': Number of key(s) added: 1 Now try logging into the machine, with: "ssh '[email protected]'" and check to make sure that only the key(s) you wanted were added. |
ログインをするときに、パスワード入力せずにログインできます。
1 2 3 |
$ ssh -i ~/.ssh/id_rsa_nopass [email protected] Last login: Fri Nov 20 09:22:42 2020 from 10.0.2.6 s1user1@sshtest:~$ |
ssh_configで事前に接続先の情報を記述し、コマンドを簡略化
ssh_configはSSHクライアントの設定ファイルになります。この設定ファイルは、~/.ssh/configまたは/etc/ssh/ssh_configを作成することで使用できます。
設定の優先順位は
- コマンドラインオプション
- ~/.ssh/config(ユーザの設定)
- /etc/ssh/ssh_config(システムの設定)
になります。
ここでは簡単なconfigファイルを作成して実行してみます。
~/.ssh/config
1 2 3 |
Host sshserver HostName 10.0.2.5 User s1user1 |
上の設定ファイルについて、
Hostのキーワードは、configに使用するキーワード(HostNameやUser等)を、その指定したパターンに限定することができます(次のHostまたはMatchのキーワードが現れるまで)。これはsshコマンドライン引数で使用するホスト名になります。そのため、サーバの名称の略語などを設定できます。
HostNameは、実際のホストのアドレスを指定します。Hostをニックネームや略語で設定した場合に使用します。これがない場合はHostNameはコマンドライン引数で指定されたホスト名と同じになります。
Userは、ログインするユーザを指定します。
コマンド例
1 2 3 4 |
$ ssh sshserver Enter passphrase for key '/home/ubuntu/.ssh/id_rsa': Last login: Tue Dec 8 08:16:16 2020 from 10.0.2.6 s1user1@sshtest:~$ |
sshのconfigファイルを作成すると、使用するsshコマンドを簡単なものにできます。