ssh 公開鍵認証設定まとめ
sshでLinuxサーバーへ接続する際のまとめ。
クライアント: Mac
サーバー: CentOS 6.5
を想定
公開鍵、秘密鍵を生成する
# このコマンドの後にパスワードの設定を聞かれる。
# パスワード無しの場合は何も入力せずにEnterを押す (非推奨)
ssh-keygen -t rsa
デフォルトの設定では、
公開鍵: ~/.ssh/id_rsa.pub
秘密鍵: ~/.ssh/id_rsa
秘密鍵は 絶対に流出させない ようにすること。
流出したら鍵を作りなおして、サーバーに登録した公開鍵を削除して登録しなおせば良い。
※2018/10/02追記
最近はrsa鍵を使うのは古い。
おすすめはecdsa、CentOS5等古い環境にアクセスするならrsa、ssh周りの知識があるならed25519が良さげ。
- ecdsa 521bit(512bitではない)
ssh-keygen -t ecdsa -b 521
- ed25519
ssh-keygen -t ed25519
秘密鍵をキーチェインに登録しておく(Mac限定)
sshするたびに秘密鍵のパスワード打つのは面倒臭いので、
Macの場合はキーチェインに登録が便利に使える。
ただし、Macを乗っ取られた際のリスクは増すので注意すること。
# ssh-agentへ登録する (-KオプションはMacのみ使用できる)
ssh-add -K ~/.ssh/id_rsa
※2019/06/11追記
最近のMacに載ってる ssh-add
では -K
オプションは少し違うらしい。
-K
オプションでキーチェーンに鍵を登録、 ssh-add -A
でキーチェーンに登録してある鍵をエージェントに追加になっている。
公開鍵をサーバーに登録する
公開鍵を対象サーバーの~/.ssh/authorized_keys
へ登録する。
ssh-copy-id を使用して登録
最も簡単な方法。
MacではHomebrewを使用すれば、ssh-copy-id
コマンドを簡単にインストールできる。
# コマンド入れてなければ入れる。
brew install ssh-copy-id
# sshするのと同じ感覚でオプションを入れる
# -i オプションを使うと、登録する公開鍵を選べる。
ssh-copy-id hoge_user@hogehoge.hoge.com
手動で登録
手動で登録する際は少々面倒くさい。
対象サーバーのユーザーへ初めて鍵登録する際は、パーミッションの設定が必要になる。
とりあえず、フォルダとファイルを作る
# ログイン
ssh hoge_user@hogehoge.hoge.com
# フォルダとファイルを作る(既に存在している場合は実行しなくても可)
mkdir .ssh
touch .ssh/authorized_keys
# 権限の設定。個々を間違えると、公開鍵認証でログイン出来ないので注意
chmod 700 .ssh
chmod 600 .ssh/authorized_keys
この後、公開鍵をサーバーへ持って行ってauthorized_keysへ追記する必要がある。
主に2パターン方法がある。
ワンライナーで対象サーバーのauthorized_keysへ追記する
推奨。簡単にできる。
cat ~/.ssh/id_rsa.pub | ssh hoge_user@hogehoge.hoge.com 'cat >> .ssh/authorized_keys'
scpで公開鍵を対象サーバーへ持って行ってauthorized_keysへ追記する
ちょっと面倒臭いが、初心者でも動作を追っていくことが簡単にできる。
scp ~/.ssh/id_rsa.pub hoge_user@hogehoge.hoge.com:
ssh hoge_user@hogehoge.hoge.com
# ログイン後
cat id_rsa.pub >> .ssh/authorized_keys
公開鍵認証で接続できるか確認
無事、鍵認証設定ができていれば、サーバーのパスフレーズを入力せずにログインができる。
ssh hoge_user@hogehoge.hoge.com
パスワード認証を禁止する
せっかく公開鍵認証を設定したのだから、パスフレーズ認証を禁止してしまおう。
# 対象サーバーへログインした状態
sudo vi /etc/ssh/sshd_config
# PasswordAuthentication no
# ChallengeResponseAuthentication no
# へ設定する
この後、sshdを再起動させることになるが すぐにログアウトはしないこと
# CentOS 6
sudo service sshd restart
# CentOS 7
sudo systemctl restart sshd
ログアウトせずに、 ターミナル等の別タブで開いてssh接続ができるか確認する。
無事、接続できたらログアウトして良い。
公開鍵認証設定OK!
※sshd再起動後、鍵登録が正常にできていなかった場合、サーバーへVNCできるか物理アクセスできないと 詰みます
番外編
ssh configの設定
少しだけ触れておきます。
sshで毎回
ssh hoge@hogehoge.com
とか手打ちするのは結構面倒くさい。
クライアント側で ~/.ssh/config
を設定すると、
ssh hg
とかで接続できるようになる。
設定方法は
vi ~/.ssh/config
Host hg
HostName hogehoge.com
User hoge
IdentityFile ~/.ssh/id_rsa
のような形式。
その他、使用する鍵ファイルの設定や多段sshの設定もできたりするので、覚えておくと吉。
※2018/10/02追記 多段sshとは
いわゆる踏み台にsshしてさらにsshすること。
localhost -> サーバーA -> サーバーB
のような接続が簡単にできるようになる。
また、サーバーAに鍵を置かないで済むようになるのでセキュア。
詳しい説明は他に譲ります。
https://qiita.com/ik-fib/items/12e4fab4478e360a82a1
なんか警告っぽいメッセージが出て接続できないんだけど
すっごく目立つ形式の警告メッセージが出てたら多分これ。
サーバーのフィンガープリントが変わってしまうと起きる。
hogehoge.com -> サーバーA
から
hogehoge.com -> サーバーB
へドメインの向き先を変えると起きる。
理由は、気付かずに異なるサーバーへ接続することを防ぐため。
~/.ssh/known_hosts
に記述されているので、ssh-keygen
コマンドかvi
を使って該当の行を削除すれば良い。
なんかめんどいと思ったら、rmで~/.ssh/known_hosts
を削除しても動くが、
複数のサーバーを運用しているならやめておいたほうが良いかも。
上級者編
個人的メモかも。
sshエージェントを使用しないでsshしたい
sshdの設定変更ができたかどうか確認したい時など。
ssh -o 'IdentitiesOnly=yes' hoge.com
sshの -o オプションを使用すると、ssh_configに書いたものと同じような効果を得られる。
man ssh
すればオプションが全部掲載されてるっぽい。