OpenSSH
あるホストにリモートから安全にログインするために、OpenSSH を使います。
状況として、PC-A というサーバと PC-B というクライアントがあると考えます。
つまり、PC-B から PC-A にリモートでログインなどすることを考えます。
サーバ設定編
以下はサーバ(PC-A)での作業です。
安全のため、パスワードによるリモートログインを不許可とし、
秘密鍵/公開鍵方式によるリモートログインのみ許可します。
インストール
デフォルトでは入っていないので、
sudo apt-get install openssh-server
でopenssh-server をインストールします。
設定は、/etc/ssh/sshd_config を変更します。
/etc/ssh/sshd_config
赤字のカッコ内、D はデフォルト設定です。
/etc/ssh/sshd_config
PermitRootLogin no rootでのログインを禁止(D: yes)
PasswordAuthentication no パスワードでの認証を禁止(D: yes)
UsePAM no PAM認証を禁止。ただし禁止するとログイン時のアップデート情報が出ない(D: yes)
ここより先はデフォルトと同じらしい
PermitEmptyPasswords no パスワードなしを禁止(D: no)
RSAAuthentication yes RSAでの認証を許可(D: yes)
PubkeyAuthentication yes 公開鍵認証を許可(D: yes)
ChallengeResponseAuthentication no チャレンジ・レスポンス認証を禁止(D: no)
設定したら、文法をチェックしてみる。
sudo sshd -t
何も出なければ大丈夫。
問題なければ、sshd を再起動する。
sudo service ssh restart
ディストリビューションによっては ssh のところが
sshd となる場合もあるようです。
クライアント設定編
以下は PC-B での作業です。
秘密鍵/公開鍵の作成
ssh-keygen というコマンドがあるのでこれで鍵ペアを作ります。
暗号化には RSA, ECDSA, Ed25519 などの方式があるので、
(暗号強度が十分であれば)好きなものを選んで下さい。
Ubuntu 14.04LTS で使えていた DSA 方式は
Ubuntu 16.04LTS では使えなくなっていました。
おそらくクライアント側の問題です。
古い時代の DSA 方式では暗号強度が十分でなかったので
通信を遮断したのかも知れません。
2023年時点で推奨されているらしい鍵作成方法
ssh-keygen -t ecdsa -b 521 -C "Comment_for_this_key"
上のオプションの意味は以下の通りです。
バージョンによって違いがあると思いますので、詳細は man を見てください。
- -t : 暗号化方式
dsa / ecdsa / ecdsa-sk / ed25519 / ed25519-sk /rsa
のいずれか。
- RSA
因数分解の困難さを使っている。
古いアルゴリズムとのことで最近では推奨されていないらしい。
- DSA
US goverment の Digital Signature Algorithm の略だそうな。
discrete logarithms を計算する困難さを使っている。
古いのでもう推奨されないとのこと。
- ECDSA
DSA の新しい版で楕円曲線を使っているとか。
現状で推奨されている。
256, 384, 521 ビットのいずれかのみをサポートしていて
521ビットが推奨されている。
- Ed25519
新しいアルゴリズムなので普遍的に使えるかは不明。
- -b : 生成する鍵のビット数
- RSA: 最小1024, デフォルト3072(十分と考えられている)
- DSA: 1024でなければならない
- ECDSA: 256, 384, 521 のどれか(他はエラーになる)
- ECDSA-SK, Ed25519, Ed25519-SK: 固定長なので -b オプションは無視される
- -C : コメント
参考: Understanding SSH Key RSA DSA ECDSA ED25519
途中
- 鍵の保存先を聞いて来ます。
ホーム直下の ~/.ssh/ に保存されるならそのまま Enter でいいでしょう。
- パスフレーズの入力を求められるので、入力と再入力をします。
パスフレーズは忘れてはいけません。
作業が終わると、デフォルトでは
- 秘密鍵 : ~/.ssh/id_ecdsa (パーミッション 600 = -rw-------)
- 公開鍵 : ~/.ssh/id_ecdsa.pub (パーミッション 644 = -rw-r--r--)
という鍵ペアができているはずです。
ls -l ~/.ssh
などでパーミッションを確認しておきましょう。
鍵の確認
作成された鍵のビット数やコメントを確認してみましょう。
ssh-keygen -l -f ~/.ssh/id_ecdsa.pub
左端にビット数、右端に方式、その左隣りにコメントが出ます。
準備
クライアント(PC-B)で秘密鍵/公開鍵のペアを作ったら、
公開鍵をサーバ(PC-A)にコピーして、
パーミッションを適切に設定します。
以下の作業は、サーバ(PC-A)での作業です。
- ホーム直下に ~/.ssh というディレクトリがなければ作成し、
パーミッションを 700 にしておく。
mkdir ~/.ssh
chmod 700 ~/.ssh
- 公開鍵が PC-A の (somewhere)/id_ecdsa.pub にあるとする。
これを ~/.ssh/authorized_keys に追加して、パーミッションを設定する。
cd ~/.ssh
cat (somewhere)/id_ecdsa.pub >> authorized_keys
chmod 600 authorized_keys
ログイン
以上の作業が終わったら、クライアント(PC-B)に戻って、
ssh でログインしてみます。
ssh -l (your-user-name-in-PC-A) (IP-or-hostname-of-PC-A)
-l オプションは PC-A と PC-B でユーザ名が異なるときに指定します。
パスフレーズの入力を求められたら、鍵を生成するときにせっていした
パスフレーズを入力します。
デフォルトでは ssh は ~/.ssh/id_ecdsa などの秘密鍵を参照しに行ってくれるので、
鍵ペア作成の際にデフォルトの位置に作成していれば問題はありません。
もし何らかの都合で秘密鍵の場所が異なる場合には、
-i オプションで明示的に秘密鍵の場所を ssh に教えてあげます。
ssh -i (place-of-privatekey) -l (your-user-name-in-PC-A) (IP-or-hostname-of-PC-A)
クライアントからサーバにファイルを転送コピーしたい場合は
scp (secure copy) を使います。
scp (file) (your-user-name-in-PC-A)@(IP-or-hostname-of-PC-A):~/
これでサーバ(PC-A)のホーム直下に (file) がコピーされます。
Last modified: Wed Apr 17 12:20:10 JST 2019