ssh
公開鍵によるパスワード無しの認証
秘密鍵 ~/.ssh/id_ed25519 を持つホストから、
公開鍵 ~/.ssh/authorized_keys を持つホストにログインできるようにする。
手元のコンピュータ1台につき1ペア生成して、公開鍵をリモートホストに登録するのが基本。 リモートホストごとに違う鍵を使うことも可能。
-
手元のコンピュータで鍵ペア (秘密鍵
id_ed25519と公開鍵id_ed25519.pub) を作成:ssh-keygen -t ed25519 # Generating public/private ed25519 key pair. # Enter file in which to save the key (~/.ssh/id_ed25519): <return> # Enter passphrase (empty for no passphrase): パスフレーズ<return> # Enter same passphrase again: パスフレーズ<return> # Your identification has been saved in ~/.ssh/id_ed25519 # Your public key has been saved in ~/.ssh/id_ed25519.pub- Ed25519を使えない古い環境ではRSA (
-t rsa -b 4096) やECDSA (-t ecdsa -b 521) を使う。 - 鍵ファイルの名前はデフォルトのままreturnが簡単。 特定のリモートサーバー用に別の鍵を用意する場合だけ変える。 使用中のものを上書きしてしまわないように注意。
- コメントは「この鍵がどこで作られたか」の人間用メモ。
ホスト名がまともならデフォルト
-C username@hostnameの形でいい。 - ここで入力するパスフレーズはログインパスワードではなく鍵の暗号化に使われる。 パスフレーズ無しのほうが断然楽ちんなのでそうされることが多いが、 ssh-agentやKeyChainを設定しておけば入力をほとんど省略できるので、 簡単なものでも設定しておいたほうが鍵ファイル流出に強くなる。
- Ed25519を使えない古い環境ではRSA (
-
できあがった鍵ペアのうち公開鍵のほう
~/.ssh/id_ed25519.pubをリモートホストの~/.ssh/authorized_keysに追加する。 やり方は場合によって異なる。- ウェブブラウザからアップロードする方法。 (e.g., GitHub > Settings)。
- ターミナルからコマンドで送り込む方法
(パスワードなど別の認証でログインできる場合):
ssh-copy-id -i ~/.ssh/id_ed25519.pub watal@example.com # or ssh watal@example.com "mkdir ~/.ssh; touch ~/.ssh/authorized_keys" cat id_ed25519.pub | ssh watal@example.com "cat >> ~/.ssh/authorized_keys"
-
~/.ssh/ディレクトリ内のパーミッションを確認:ls -al ~/.ssh # drwx------ . # -rw------- authorized_keys # -rw------- config # -rw------- id_ed25519 # -rw-r--r-- id_ed25519.pub # -rw------- known_hosts外に出していい公開鍵
.pub以外はユーザー本人だけが読み書きできるように。 必要があれば次のようなコマンドで修正:chmod 700 ~/.ssh chmod 600 ~/.ssh/id_ed25519 chmod 600 ~/.ssh/authorized_keys
設定
~/.ssh/config
ssh する側のユーザー毎の設定。
設定項目は ssh_config と同じ。
先に書いたものが優先されるので、一般設定は最後に:
Host beast
Hostname 192.168.6.66
User eddie
Host *.ddbj.nig.ac.jp
User heavywatal
RequestTTY yes
Host *
PasswordAuthentication no
KbdInteractiveAuthentication no
GSSAPIAuthentication no
StrictHostKeyChecking no
VisualHostKey yes
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
ユーザー名やアドレスをセットにしてニックネームをつけることで、入力を省略できる。
例えば上のような設定を ~/.ssh/config に書いておけば以下の2つは等価:
ssh eddie@192.168.6.66
ssh beast
macOSで UseKeychain yes にしておけばパスフレーズ入力は最初の1回だけで済む。
パスフレーズ無しのような手軽さで秘密鍵の流出に強くなる。
AddKeysToAgent yes を設定せず
ssh-add -l が The agent has no identities. を返す状態でも行ける。
/etc/ssh_config
ssh する側のコンピュータ全体の設定。
普通は ~/.ssh/config で事足りるのでいじらない。
サーバー間の通信を調整する管理者向け。
/etc/sshd_config
ssh される側のデーモンの設定。余計な入り口を塞ぐべし:
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
KerberosAuthentication no
GSSAPIAuthentication no
UsePAM no
PermitRootLoginwithout-passwordはprohibit-passwordに取って代わられた。KbdInteractiveAuthenticationChallengeResponseAuthenticationは取って代わられた。
ファイル転送
ファイルひとつならscpでもいいけどそれ以上なら
rsync を使ったほうがよい。
あるいはsshfsでマウントしてしまうのも楽ちん。
環境変数
echo $SSH_CONNECTION
[client IP] [client port] [server IP] [server port]
どこから ssh したか、を取得するには
echo $SSH_CONNECTION | awk '{print $1}'