「小型のメディアサーバー兼NASをたてる その3 〜初期設定、SSH編〜 : 或る阿呆の記」でSSHの公開鍵認証について触れていますが、他記事を紹介するだけの投げやりっぷりだったので、それもどうかと思い自分なりの解説記事も書くことにしました。
前提として、Debian/Ubuntu系です。
やること
sshやscpで、パスワードを打たずにログインします。sshでの鍵の作り方。設定の仕方を学びます。普段リモートでよくログインするならば、鍵認証のほうが楽です。特にシェルスクリプトなんかでログインする必要がある場合、鍵認証じゃないと自動化できずありがたみ激減です。
注意として、鍵認証が制限されている場合は使えません。デフォルトではだいじょうぶですが、サーバーによっては禁止されていることもあります。
知識
何をしようとしているか、ざっくり把握するための知識。何事も、知識があるのとないのとでは、身につき方が違います。
ssh
Secure SHell。安全にリモートのコンピュータと通信するためのプロトコル。暗号化などを行います。LinuxではOpenSSHなどのソフトウェアがデフォルトで入ってるので、すぐに使えることが多いですが、入ってなかったらインストールが必要です。サーバは以下でインストールできます。
sudo apt update
sudo apt install openssh-serverコマンドはそのままssh。scpは、ssh通信を利用してリモートのコンピュータとデータをやりとりするコマンドです。
鍵認証
一般的な認証にパスワード認証があります。パスワードを打ち込んで、それが設定したパスと一致すればログインOKなあれです。
鍵認証はパスワードを打つのではなく、鍵と呼ばれる暗号化のためのランダムな文字列を使います。鍵は公開鍵と秘密鍵のペアで、公開鍵で暗号化したものは秘密鍵でしか復号できないし、逆もまた然り。
つまり、相手から公開鍵で暗号化したデータを送ってもらえば、それを復号できるのは秘密鍵をもってる自分だけということです。パスワードを使わないことはセキュリティの向上に繋がりますし(ブルートフォースアタックを防げる)、単純に便利だということもあります。
もちろん、 秘密鍵が漏れてはなんにもなりません。というかヤバイです。最近FreeBSD関係でそんなニュースがありました(FreeBSDで不正侵入、サードパーティーパッケージに影響も - ITmedia エンタープライズ)。
鍵とは別にパスは設定できます。
RSA
暗号化の方式。開発した三人のイニシャルが使われています。バージョン1とバージョン2があり、暗号化の主流です。OpenSSHだとDSAなる方式でも暗号化できますが、RSAでの暗号化を推奨されています。
方法
手順は以下。
手順
おおまかな手順は以下です。
- クライアント側で鍵の作成
- 公開鍵をログインしたいサーバーにコピー
- サーバー側で公開鍵を認証リストに加える
実装
クライアント側で鍵の作成
ssh-keygen -t ed25519 -f ~/.ssh/id_rsaオプションの-tの意味は、暗号化の方式の指定です。昔はRSAが標準でしたが、現在はed25519を使うのが良いとされています。互換性を重視する場合は-t rsaとします。-f以降は後述する鍵の名前になりますが、指定しているのはrsa方式のデフォルトと合わせるためです。
なんだかいろいろ聞かれますけど、全部エンターキーで進めばOKです。パスフレーズを決めないことで、鍵のみでログインすることができるようになります。セキュリティが心配ならもちろん設定してもOK。
ここで決めたパスは秘密鍵に登録されます。秘密鍵はクライアント側で保持するので、サーバーにパスを知られる心配がありません。パスフレーズは、秘密鍵が漏れた時の最後の砦になりますが、漏れている時点でもう色々とアウトな気がするので、利便性と天秤にかけて、私は設定していません。
鍵は~/.ssh/に、id_rsaとid_rsa.pubが作成されます。id_rsaが秘密鍵で、id_rsa.pubが公開鍵です。秘密鍵のアクセス権は600になっている必要があるので、ls -lなどで確認してください。また、.sshディレクトリのアクセス権は700でなくてはいけません。なっていない場合は以下。
chmod 600 ~/.ssh/id_rsa
chmod 700 ~/.ssh公開鍵をログインしたいサーバにコピー
scpでコピーするのですが、サーバ側に~/.sshディレクトリがあるかどうかをまず確認。なければ、クライアント側と同じようにサーバ側でもssh-keygenコマンドで鍵を生成したりなどして、.sshディレクトリを作成しておきます。別にmkdirで作ってもよいですが…。.sshディレクトリのパーミッションは700です。
cd ~/.ssh
scp id_rsa.pub user@host:.ssh/id_rsa_client.pubここではコピー先の名前をid_rsa_client.pubとしましたが、別になんでもよいです。わかりやすい名前のほうが混乱しなくてよいというだけで。
サーバ側で公開鍵を認証リストに加える
デフォルトだと、認証リストはauthorized_keysファイルです。.sshディレクトリになければ作成します。
cat id_rsa_client.pub >> authorized_keysリダイレクトは>ではなく>>。>は追記ではなく上書きなので、それまでの記録が消えます。また、authorized_keysはパーミッションが644である必要があります。
systemd
サーバの起動設定。
sudo systemctl start ssh
sudo systemctl enable ssh
sudo systemctl status sshファイアウォール
22番を使うので開けます。
sudo ufw allow ssh
sudo ufw enableいけたかな?
以上で、パスなしでログインできるようになります。できないときはパーミッションの設定などがミスっている可能性大です。~/.ssh、id_rsa、authorized_keysあたりをよく見直すべし。また、もしいじっていればですが、ホームディレクトリのパーミッションも、他ユーザーからの書き込みを許可していると弾かれます(777とか…参考「SSHが鍵認証されないとき、パーミッションを疑え。 - それマグで!」)。
もし秘密の鍵のパスを指定したい場合、下記のようにします。
ssh -i ~/.ssh/id_rsa user@hostまぁ、デフォルトのパスで普通に使っている限りは必要ないはずです。
そのほか
sshの設定ファイルは/etc/ssh/sshd_configにあります。内容は参考にあるリンク参照。authorized_keysの場所なども決められます。sshの設定はセキュリティ的に大事なので、余裕がでてきたらいろいろ調べるとよいです。特に外部公開するときには…。 設定ファイルを変更したら、sshdデーモンを再起動します。再起動のコマンドは
$ sudo service ssh restartauthorized_keysに公開鍵を書きこんでくれるコマンドもあるにはあるがかえって手間っぽい。専用コマンドを使えば打ち間違いのリスク(追記と上書きの間違いとか…)はなさそうですが、私はいつもcatでやってます。
おわりに
なお、本記事で紹介したパスフレーズなしの鍵認証は、セキュリティ的には推奨されるものではありません。スクリプト内でパスを入れるには、expectコマンドを使う手があります。スクリプト内にパスを書くのはもちろんNGなので、環境変数に入れておくなどの工夫がいるでしょう。
私は面倒なのでパスなしで運用しています。秘密鍵が漏れた時点でもう終わりかなぁと…。セキュリティと利便性はトレードオフですから、自身の用途、必要なセキュリティのバランスを加味したうえで、参考になればと思います。
参考
ssh公開鍵認証手続き…実装はほとんどここ参考しました…が…もう見えない…
公開鍵暗号でSSHのセキュリティを高める…概念的な話したが…もう消えてますね。
SSH サーバの設定…SSHの設定ファイルについてです。
コメント
コメント一覧 (2件)
なかなかうまくいかなかったのが
このサイトではうまくパス無しでログインできました。
たすかりました。ありがとうございました。
>masahiroさん
コメントありがとうございます。
ネット上には情報が溢れていますが、体系だってはいませんし、また想定されるレベルがまちまちであるためか、必ずしもわかりやすくはありません。本記事がお役に立てて何よりです。