Linux入門:コマンド操作のきほん
リモート接続 SSH
22 番は、世界中から総当たりされている
インターネットに置いたサーバーの認証ログを開くと、知らない国から root や admin でのログイン試行が 1 日に何千件も並んでいます。相手は人間ではなく、辞書を順に試すプログラムです。
パスワードは、いつか当たる可能性がある文字列です。だから本番サーバーへの接続には鍵を使います。鍵は文字数が桁違いに多く、総当たりで当てることが現実的に不可能なので、パスワードを覚える必要も、破られる心配も無くなります。パスワード認証は最初から使わない前提で組んでください。
ターミナル
ssh deploy@example.com
# 相手のサーバーのシェルが手元のターミナルに出てくる初回だけ、相手の身元を示す文字列を確認するかと聞かれます。yes と答えると ~/.ssh/known_hosts に記録され、次回からは自動で照合されます。ここで毎回警告が出るなら、相手が作り直されたか、途中で誰かがすり替わっています。
鍵は 2 つで 1 組になっている
作るのは 1 回です。アルゴリズムはいくつかありますが、いまは Ed25519 を選んでおけば十分です。
ターミナル
ssh-keygen -t ed25519 -C "自分のメールアドレス"
# ~/.ssh/id_ed25519 秘密鍵 自分の手元にだけ置く
# ~/.ssh/id_ed25519.pub 公開鍵 相手のサーバーに登録する.pub が付く方が公開鍵で、これはサーバーに渡すために作られたものです。.pub が付かない方が秘密鍵で、これは誰にも渡しません。 チャットに貼らない、同僚と共有しない、リポジトリに入れない。この 3 つだけ守ってください。誤ってコミットしてしまったら、消して済ませず作り直します。
公開鍵をサーバー側に置く作業は、コマンドが用意されています。
ターミナル
ssh-copy-id deploy@example.com
# 一度だけパスワードを聞かれ、以降は鍵で入れるようになる権限が緩いと、鍵は黙って無視される
鍵を置いたのに Permission denied (publickey) が出続ける、という詰まり方をよくします。原因の大半はファイルの権限です。自分以外にも読めるファイルに置いた秘密鍵を、SSH は危険とみなして最初から使いません。エラー文には権限のことが書かれないので、気づくのに時間がかかります。
ターミナル
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519ディレクトリは本人だけが出入りでき、秘密鍵は本人だけが読み書きできる状態にします。サーバー側で公開鍵を並べておく ~/.ssh/authorized_keys も同じ考え方で、本人だけが書き換えられる必要があります。
チームで同じ本番サーバーに入るときは、1 人 1 組の鍵を作って公開鍵を全員分並べます。1 つの鍵を共有すると、誰かが抜けるたびに全員の鍵を作り直すことになり、運用がすぐ回らなくなります。