Dance with Agents

SSHの肝:鍵・強度・パーミッション・置き場所

SSHで最初につまずきやすい4つのポイント(鍵の作り方、強度の考え方、パーミッション、ファイルの置き場所)を1ページに。

SSHは最初のハードルが高いところ。ここでは「とりあえずこれだけ押さえておけば動く」という4点に絞ってまとめる。

鍵の作り方

ssh-keygen -t ed25519 -C "わかりやすいコメント(例: 自分のメールアドレス)"
  • 実行すると「秘密鍵」と「公開鍵」の2つのファイルができる
  • 保存先を聞かれたら、特に理由がなければデフォルト(~/.ssh/id_ed25519)のままEnterでよい
  • パスフレーズ(鍵専用のパスワード)はできれば設定する

鍵の強度についての基本的な考え方

種類 今どうか
ed25519 現在の第一選択。鍵が短く、速く、十分に安全
rsa(4096bit以上) まだ使えるが、ed25519対応の相手なら基本不要
dsa 古く非推奨。新規に作らない

迷ったらed25519を選んでおけば間違いない。

パーミッション(ここでよく詰まる)

SSHは、権限(パーミッション)が緩すぎるファイルを見つけると、警告を出して接続を拒否することがある。権限の変更にはchmodを使う。

対象 権限 コマンド
~/.sshディレクトリ 700(自分だけ読み書き実行可) chmod 700 ~/.ssh
秘密鍵(id_ed25519など) 600(自分だけ読み書き可) chmod 600 ~/.ssh/id_ed25519
公開鍵(.pub) 644 chmod 644 ~/.ssh/id_ed25519.pub
authorized_keys 600 chmod 600 ~/.ssh/authorized_keys
config 600 chmod 600 ~/.ssh/config

「鍵は合っているはずなのに繋がらない」と思ったら、まずここを疑う。

ファイルの置き場所

~/.sshは、ファイル管理アプリで普通に見ようとしても出てこない。名前が.(ドット)から始まるフォルダは「不可視フォルダ(隠しフォルダ)」として、通常は表示されない仕組みになっているためで、壊れているわけではない。

環境 見る方法
Mac(ターミナル) ls -a(-aを付けると隠しファイルも表示)
Mac(Finder) Cmd + Shift + .
Windows(PowerShell) Get-ChildItem -Force
Windows(エクスプローラー) 「表示」タブ→「表示・非表示」→「隠しファイル」にチェック

ここで混乱しやすいのが、同じ~/.sshでも「自分のパソコンの中」と「接続先サーバの中」の2か所あるという点。どちらの話をしているかを意識すると、ぐっと分かりやすくなる。

自分のパソコン側(接続する側)

ファイル 役割
~/.ssh/id_ed25519 自分の秘密鍵(人に渡さない)
~/.ssh/id_ed25519.pub 自分の公開鍵(接続先に渡す)
~/.ssh/config よく繋ぐ先の接続設定をまとめておける(aliasという救世主と同じ「毎回書かなくていい」の発想)
~/.ssh/known_hosts 過去に接続したサーバの記録

接続先サーバ側(接続される側)

ファイル 役割
~/.ssh/authorized_keys そのサーバへのログインを許可する公開鍵の一覧

authorized_keysは接続先サーバの中にあるファイルで、自分のパソコンから持っていくものではない。すでにあるそのファイルに、自分の公開鍵の中身を1行書き足す(追記する)ことで「この鍵を持っている人はログインしてよい」と登録する、という仕組み。

公開鍵(.pub)の中身

1行のテキスト。これは人に渡していいファイル(メールで送る、authorized_keysに貼り付ける、どちらもOK)。

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... わかりやすいコメント

秘密鍵の中身

複数行のテキスト。これは絶対に人に渡さない・どこにも貼り付けないファイル。名前に.pubが付いていない方が秘密鍵。

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAAB...(中略、複数行続く)
-----END OPENSSH PRIVATE KEY-----

公開鍵と秘密鍵は名前が似ているので、扱いを間違えないよう「.pubが付いている方だけ人に渡していい」と覚えておくとよい。

authorized_keysの中身

接続先サーバに置くファイル。自分の公開鍵の中身を1行まるごと貼り付ける、という形式(複数人に許可するなら1行ずつ追加)。

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... わかりやすいコメント

レンタルサーバーでは、管理画面から登録する

上は、サーバーの中にログインできる場合の話である。レンタルサーバーは、SSHそのものを管理画面から有効にする作りになっていることがあり、その場合SSHでログインできるようになる前にauthorized_keysを編集する方法が無い。鶏と卵になる。

そういうサービスは、管理画面に公開鍵を貼り付ける欄を用意している。貼り付けると、サービス側がauthorized_keysに書き足す。やっていることは同じで、書き足す作業をサービス側が代行しているだけ。

⚠️ その画面には「鍵ペアをサーバー側で生成する」という選択肢が並んでいることが多い。これはサーバーが秘密鍵を作って、それをダウンロードさせる方式で、手元でssh-keygenして公開鍵だけ渡す流れとは逆向きである。手元で作った鍵を使うなら、貼り付けるほうの欄を選ぶ。名前だけ見ると生成してくれるほうが楽に見えるので、ここで取り違えやすい。

configの中身

接続元(自分のパソコン)に置くファイル。よく繋ぐ先を、短い名前で呼べるようにしておける。

Host mymac
    HostName 100.x.x.x
    User onamae
    IdentityFile ~/.ssh/id_ed25519

こう書いておけば、ssh mymacの一言で接続できる。長いホスト名やユーザー名を毎回打たなくてよくなる、configならではの恩恵。ここに書いた名前はmoshからもそのまま使える。

configだけで足りない場合(コマンド全体を短くしたい場合)はaliasという救世主と組み合わせる。

接続先が22番以外のポートを使っているとき

SSHは既定で22番のポート(通信の入口の番号)を使う。この番号を変えているサーバーがある。 22番には総当たりでパスワードを試す機械が集まるので、別の番号に変えているところがある。たとえばエックスサーバーは10022番である(公式マニュアルに記載)。

番号が合っていないと、鍵が正しくても接続できない。 Connection refused(接続を断られた)やOperation timed out(応答が無いまま時間切れ)で終わる。鍵の問題に見える表示ではないのに、鍵を疑って時間を使うことになりやすい。

configにPortの行を足す。

Host myserver
    HostName example.xsrv.jp
    User myaccount
    Port 10022
    IdentityFile ~/.ssh/id_ed25519

何番かは契約したサービスの案内に書いてある。推測で試さない。

リモート開発環境の記事

リモート開発環境のページへ →