Edited at

ssh公開鍵認証設定まとめ


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 すればオプションが全部掲載されてるっぽい。