sshを公開鍵暗号方式にする
Contents
sshを公開鍵暗号方式にする
RaspberryPi 3 B+(Raspbian Version:June 2019 Kernel version:4.19)のsshはデフォルトはパスワード認証(IDとパスワードで認証)になっている。
通信が暗号化されるよりセキュリティ強度の高い公開鍵暗号方式に変更した時の備忘録。
尚、今回はラズパイ(Raspbian)にて行ったがLinux全般で適用できる内容になっている(はず)
接続先機器 | RaspberryPi 3 B+ |
接続先OS | Raspbian
DebianベースのOS |
接続元端末 |
の2パターンを試している 接続元がWindows(puTTY)の時とLinuxでは秘密鍵のフォーマットが異なるので2パターンを試した |
公開鍵と秘密鍵の作成
公開鍵、秘密鍵の作成はRaspbian(Linux)側でssh-keygenコマンドで作成する方法とWindows側のpuTTYgenソフトで作成する方法がある。
前者はOpenSSH 7.8※で秘密鍵のフォーマットが変更になった事もあり、ちょっと手間取った(後述)
まずは後者のpuTTYgenで公開鍵と秘密鍵を生成する方法について書く。
また接続される側(ラズパイ)でsshd_configを編集してセキュアにする為の設定も行っている。
puTTYgenで鍵の生成
Windows 10 HomeのpuTTYgen(Ver 0.60)で公開鍵と秘密鍵を作成する。
大まかな手順は以下の通り。
- puTTYgenで公開鍵、秘密鍵を作成して保存する
- 公開鍵を接続先(ラズパイ)に送り登録する
- 公開鍵ファイルの削除と権限の設定
- 秘密鍵を使ってWindows上のpuTTY、WinSCPから接続する※
- sshd_configを編集してセキュリティを高める
※Linuxマシンのターミナルからラズパイに接続する場合はpuTTYgenでが生成する秘密鍵(*.ppk)はpuTTY専用なので使えない。OpenSSHの*.pem形式にpuTTYgenで変換する必要がある(後述)
puTTYgenで公開鍵、秘密鍵を作成して保存する
puTTYgenを起動する。
- 生成する鍵の種類:SSH-2(RSA)
- 生成する鍵のビット数:2048
を入力して「生成」ボタンを押す。
乱数を生成する為に空白エリアでマウスを適当に動かす。
鍵が生成される。
公開鍵はモザイクマスクをしているが公開されてしまっても問題は無い。
鍵の指紋(フィンガープリント)は公開鍵を識別する為の(公開鍵よりも)短い文字列。
最初に公開鍵に接続する時に表示される。
- 鍵のコメント:コメントを入力する(接続時に表示される)
- パスフレーズ:未入力でも鍵の作成は可能だが設定しておくべき(2回入力)
「公開鍵の保存」「秘密鍵の保存」ボタンでそれぞれ鍵ファイルを保存する。
- 公開鍵ファイル名:id_rsa.pub
- 秘密鍵ファイル名:SKRPi0003_rsa.ppk
で保存した。
puTTYgenは終了する。
公開鍵を接続先(ラズパイ)に送り登録する
id_rsa.pubをラズパイ側にWinSCP等でコピーして/home/login名/.sshディレクトリに保存する。
.sshディレクトリがない場合は作成する。
cd ~/
mkdir .ssh
cd .ssh
ssh-keygenで公開鍵を登録する。
ssh-keygen -i -f id_rsa.pub >> authorized_keys
-i | 鍵ファイルを読み出しOpenSSH互換形式に変換してから標準出力に出力する >>でリダイレクトしている |
-f id_rsa.pub | -fはファイル指定 id_rsa.pubファイルを対象にする |
authorized_keys | 公開鍵ファイル名 sshd_configで指定する(後述) |
公開鍵ファイルの削除と権限の設定
元の公開鍵ファイル(id_rsa.pub)は不要なので削除しておく。
また公開鍵(authorized_keys)も権限を最小限にしておく。
rm id_rsa.pub
chmod 400 authorized_keys
秘密鍵を使ってWindows上のpuTTYから接続する
puTTYでの接続
先程作成した秘密鍵ファイルをpuTTYの接続ー>SSH→認証で指定する。
ちなみに認証ファイル名を変更した後、そのままだと変更が保存されずに次回接続時に情報が消えてしまう。
一旦、セッションに戻って「保存」ボタンで保存する。
「開く」ボタンで接続する。
login名を入力するとパスフレーズの入力を求められる。
また先程入力した”鍵のコメント”がここに表示される。
パスフレーズを入力すると接続される。
winSCPでの設定
ログインのサイト一覧にて「編集」ボタンをクリックする。
「設定」ボタンをクリックする。
SSHー>認証の秘密鍵にて先程作成した秘密鍵を指定したら「OK」ボタンをクリックして先程の画面に戻ったら「保存」する。
接続するとpuTTYと同様にパスフレーズを求められるので入力する。
Windowsからの接続は以上で終了。
しかしこのままだとラズパイはパスワード認証と公開暗号化方式の2通りでssh接続が可能な状態になっている。
後述のラズパイのsshd_configを編集してよりセキュアな設定に変更する。
接続元がLinuxの場合
sshd_configファイルの編集の前に接続元がLinuxの場合についてのセクション。
関係ない人はsshd_config編集に飛んでしまって大丈夫。
OpenSSH形式の秘密鍵の作成
*.ppkファイルはpuTTY用(puTTY Private Key)なので接続元がLinuxの場合はそのままでは使用できない。
puTTYgenを使ってOpenSSH形式の*.pemに変換する必要がある。
puTTYgenを起動して「読込」ボタンをクリックする。
パスフレーズを入力する。
読み込まれたら変換ー>OpenSSH形式へエクスポートを選択する。
拡張子を*.pemに変更して保存する。
puTTYgenは終了する。
.sshにコピーする
作成したOpenSSH形式の秘密鍵を/home/login名/.ssh配下にコピーする。
※必要に応じて.sshディレクトリを作成する。
接続
ターミナルから以下のコマンドでラズパイに接続する。
ssh -p ポート番号 -i /home/login名/.ssh/SKRPi0003_rsa.pem login名2@XXX.XXX.XXX.XXX
-p ポート番号 | -p ラズパイのsshのポート番号 デフォルトは22が設定されている |
-i /home/login名/.ssh/SKRPi0003_rsa.pem | -i 秘密鍵へのPath、ファイル名を指定する |
login名2 | ラズパイへのlogin名 |
XXX.XXX.XXX.XXX | ラズパイのIP Address 名前解決されているのであればドメイン名でもOK |
パスフレーズの入力を求められるので入力すると接続される。
sshd_configの設定
接続される側(ラズパイ)のsshd_configファイルを編集してよりセキュアな設定にする。
ちなみにsshd_configは他の端末からsshで接続される時の設定、ssh_configは他の端末へ接続する時の設定ファイルとなる。
sudo vi /etc/ssh/sshd_config
Port | Port XXXXX デフォルトのポート番号は22で良く知られているポート番号なので攻撃対象にされやすいので変更する XXXXXは49152~65535の任意の値を指定する |
SyslogFacility AUTHPRIV | ログのファシリティ(種類)を指定する AUTHだったのでAUTHPRIV(推奨)に変更した 正直、違いはよく分かっていない |
LogLevel INFO | ログのレベル INFO(情報)を指定した 障害対応時にはDEBUGなども指定できるがユーザのプライバシーを侵害するので通常時では非推奨とあった |
LoginGraceTime 20 | ログイン猶予時間 ログイン画面が表示されてからログイン操作が行われるまでの猶予時間 この時間を過ぎるとログイン画面がタイムアウトする デフォルトは120秒の所、短めの20(秒)を設定した 自分はパスワードの自動入力ソフトを使っているので10秒でも問題は無いが手動で入力する人はもう少し長くても良いかも知れない |
PermitRootLogin no | rootログインの許可 デフォルトはprohibit-password(パスワード禁止)だがrootは使用しないのでno(rootでのログイン不可)に変更した |
StrictModes yes | ストイック(厳格)なモード yesだとユーザのファイルおよびホームディレクトリの所有権と権限をチェックする デフォルトはyesだが明示的に指定した |
MaxAuthTries 3 | 1接続の認証最大リトライ回数 デフォルトは6回の所、少なめの3を指定した 前述の通りパスワード自動入力ソフトを使っているので基本的に何回も間違えることは無い ここで指定された回数の半分(つまり2回)を超えるとログに記録される |
MaxSessions 2 | 最大セッション数 デフォルトは10(セッション)だが少なめの2を指定している |
PubkeyAuthentication yes | 公開鍵認証を許可するかどうか デフォルトはyesだが明示的にyesを指定した |
公開鍵のファイル名 先程はこのPath、ファイル名で公開鍵を作成した デフォルトは.ssh/authorized_keys .ssh/authorized_keys2だがkeys2の方は削除した | |
PasswordAuthentication no | パスワード認証 デフォルトではyesになっているのでこのままだとパスワード認証と公開鍵認証の両方で接続できてしまう noに変更した ※公開鍵認証で接続できる事を確認した上でnoに変更しないと辛い目にあうので注意! |
PermitEmptyPasswords no | 空のパスワードを許可するかどうか デフォルトはnoだが明示的に指定した |
ChallengeResponseAuthentication no | チャレンジレスポンス認証を許可するかどうか チャレンジレスポンス認証とはワンタイムパスワード方式の1つとの事 ユーザがログイン時にログイン先から問題を受け取り、回答する事によりログインできる仕組み 「鍵認証の時はnoにすべし」の記事を見たのでnoにしているがいまいち理解していない 下記のUsePAMも含めてyesにしてみたが違いが分かっていない |
UsePAM no | PAM(Pluggable Authentication Module)インターフェイスによる認証を許可するかどうか noにしている |
ファイル編集後は以下のコマンドでsshを再起動する。
sudo /etc/init.d/ssh restart
以上の設定で公開暗号化方式での接続は可能になる。
ssh-keygenで鍵の生成
続けてLinuxコマンドのssh-keygenにて公開鍵、秘密鍵を作成する方法も書いておく。
大まかな手順は以下の通り。
- Linuxコマンドのssh-keygenで公開鍵、秘密鍵を作成する
- 公開鍵を接続先(ラズパイ)で登録する
- 公開鍵ファイルの削除と権限の設定
- 秘密鍵をpuTTYgenでpuTTY用のキー形式(*.ppk)に変換する
- Windows上のpuTTY、WinSCPから接続する
- sshd_configを編集してセキュリティを高める
ssh-keygenコマンド
ホームディレクトリにて以下のコマンドで公開鍵、秘密鍵を作成する。
ssh-keygen -t rsa
-t rsa | RSAタイプの鍵を作成する |
-m pem | このオプションを指定すると旧タイプの形式で鍵を作成する(今回は指定してない) 2019年の初頭頃に秘密鍵の形式が変わったらしく-m pemをつけずにssh-keygenを実行するとRaspbian(Kernel version:4.19)では新しい形式の秘密鍵が生成される
ちなみにUbuntu Server 16.04 LTSでは-m pemを付けなくても従来形式の秘密鍵が作成された |
上記コマンド入力すると
- Enter file in which to save the key(/home/login名/.ssh/id_rsa):と表示されるので空エンター
- Enter passphrase(empty for no passphrase):と表示されるのでパスフレーズを入力する
- Enter same passphrase again:と表示されるの再度同じパスフレーズを入力する
必要に応じて.sshディレクトリが作成されて/home/login名/.ssh/配下に
- id_rsa:秘密鍵
- id_rsa.pub:公開鍵
が作成される。
公開鍵を接続先(ラズパイ)で登録する
id_rsa.pubをauthorized_keysにコピーする。
cd .ssh
cp id_rsa.pub authorized_keys
公開鍵ファイルの削除と権限の設定
元の公開鍵ファイル(id_rsa.pub)は不要なので削除しておく。
また公開鍵(authorized_keys)も権限を最小限にしておく。
rm id_rsa.pub
chmod 400 authorized_keys
puTTYgenで鍵を変換する
WinSCP等でid_rsaファイルを接続元にコピー(移動)した後、puTTYgenにて*.ppk形式の鍵に変換する。
ここでひとつ問題が。
ssh-keygenで作成された秘密鍵は-m pemオプションを指定して古い形式の秘密鍵を生成したとしてもpuTTYgen 0.60では読み込めなかった。
ubuntu 16.04 LTSのssh-keygenで生成した鍵は読み込めるので標準で新しい形式の秘密鍵を生成する最近のssh-keygenだとpuTTYgen 0.60だと駄目な模様。
仕方が無いのでこちらのサイトから最新(2020年1月時点でVer 0.73)のpuTTYとpuTTYgenをダウンロードした。
puTTYgen起動する(英語版になっている)
「Load」ボタンでid_rsaを読み込む。
パスフレーズを聞かれるので入力する。
鍵が読み込まれるので「Save private key」ボタンをクリックする。
*.PPK(puTTY Private Key)形式で保存する。
保存したらpuTTYgenは終了する。
Windows上のpuTTY、WinSCPから接続する
puTTY、WinSCPで秘密鍵を指定して接続する。
接続方法は前述のセクションを参照の事。
秘密鍵の設定場所は以下の通り。
sshd_configを編集してセキュリティを高める
最後にsshd_configファイルを編集してセキュリティを高める。
こちらについても前述のセクションを参照のこと。
以上でssh接続をパスワード方式から公開暗号化方式へ変更した時の記事は終了する。
1件の返信
[…] 公開鍵ファイル名sshd_configで指定する(後述) […]