sshを公開鍵暗号方式にする | そう備忘録

sshを公開鍵暗号方式にする

sshを公開鍵暗号方式にする

RaspberryPi 3 B+(Raspbian Version:June 2019 Kernel version:4.19)のsshはデフォルトはパスワード認証(IDとパスワードで認証)になっている。

通信が暗号化されるよりセキュリティ強度の高い公開鍵暗号方式に変更した時の備忘録。

尚、今回はラズパイ(Raspbian)にて行ったがLinux全般で適用できる内容になっている(はず)

接続先機器

RaspberryPi 3 B+

接続先OS

Raspbian

  • Version:June 2019
  • Kernel version:4.19

DebianベースのOS

接続元端末

  1. Windows10 Home 1903からpuTTY(0.60)でssh接続
  2. Ubuntu 16.04 LTSのターミナルからssh接続

の2パターンを試している

接続元がWindows(puTTY)の時とLinuxでは秘密鍵のフォーマットが異なるので2パターンを試した

公開鍵と秘密鍵の作成

公開鍵、秘密鍵の作成はRaspbian(Linux)側でssh-keygenコマンドで作成する方法とWindows側のpuTTYgenソフトで作成する方法がある。

前者はOpenSSH 7.8※で秘密鍵のフォーマットが変更になった事もあり、ちょっと手間取った(後述

※Raspbian(Kernel version:4.19)はデフォルトでは新しいフォーマットの鍵を生成する

まずは後者のpuTTYgenで公開鍵と秘密鍵を生成する方法について書く。

また接続される側(ラズパイ)でsshd_configを編集してセキュアにする為の設定も行っている。

puTTYgenで鍵の生成

Windows 10 HomeのpuTTYgen(Ver 0.60)で公開鍵と秘密鍵を作成する。

大まかな手順は以下の通り。

  1. puTTYgenで公開鍵、秘密鍵を作成して保存する
  2. 公開鍵を接続先(ラズパイ)に送り登録する
  3. 公開鍵ファイルの削除と権限の設定
  4. 秘密鍵を使ってWindows上のpuTTY、WinSCPから接続する※
  5. sshd_configを編集してセキュリティを高める

※Linuxマシンのターミナルからラズパイに接続する場合はpuTTYgenでが生成する秘密鍵(*.ppk)はpuTTY専用なので使えない。OpenSSHの*.pem形式にpuTTYgenで変換する必要がある(後述

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→認証で指定する。

puTTYでの秘密鍵の指定

ちなみに認証ファイル名を変更した後、そのままだと変更が保存されずに次回接続時に情報が消えてしまう。

一旦、セッションに戻って「保存」ボタンで保存する。

セッションを保存する

「開く」ボタンで接続する。

login名を入力するとパスフレーズの入力を求められる。

また先程入力した”鍵のコメント”がここに表示される。

puTTYで接続

パスフレーズを入力すると接続される。

puTTYで接続される

winSCPでの設定

ログインのサイト一覧にて「編集」ボタンをクリックする。

編集ボタンをクリックする

「設定」ボタンをクリックする。

設定ボタンをクリックする

SSHー>認証の秘密鍵にて先程作成した秘密鍵を指定したら「OK」ボタンをクリックして先程の画面に戻ったら「保存」する。

接続するとpuTTYと同様にパスフレーズを求められるので入力する。

SSH、認証

Windowsからの接続は以上で終了。

しかしこのままだとラズパイはパスワード認証と公開暗号化方式の2通りでssh接続が可能な状態になっている。

後述のラズパイのsshd_configを編集してよりセキュアな設定に変更する。

接続元がLinuxの場合

sshd_configファイルの編集の前に接続元がLinuxの場合についてのセクション。

関係ない人はsshd_config編集に飛んでしまって大丈夫。

OpenSSH形式の秘密鍵の作成

*.ppkファイルはpuTTY用(puTTY Private Key)なので接続元がLinuxの場合はそのままでは使用できない。

puTTYgenを使ってOpenSSH形式の*.pemに変換する必要がある。

puTTYgenを起動して「読込」ボタンをクリックする。

読み込み

パスフレーズを入力する。

パスフレーズを入力する

読み込まれたら変換ー>OpenSSH形式へエクスポートを選択する。

変換、OpenSSH方式にエクスポート

拡張子を*.pemに変更して保存する。

puTTYgenは終了する。

拡張子を*.pemに変更して保存する

.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を指定した

AuthorizedKeysFile .ssh/authorized_keys

公開鍵のファイル名

先程はこの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にて公開鍵、秘密鍵を作成する方法も書いておく。

大まかな手順は以下の通り。

  1. Linuxコマンドのssh-keygenで公開鍵、秘密鍵を作成する
  2. 公開鍵を接続先(ラズパイ)で登録する
  3. 公開鍵ファイルの削除と権限の設定
  4. 秘密鍵をpuTTYgenでpuTTY用のキー形式(*.ppk)に変換する
  5. Windows上のpuTTY、WinSCPから接続する
  6. sshd_configを編集してセキュリティを高める

ssh-keygenコマンド

ホームディレクトリにて以下のコマンドで公開鍵、秘密鍵を作成する。

ssh-keygen -t rsa

-t rsa

RSAタイプの鍵を作成する

-m pem

このオプションを指定すると旧タイプの形式で鍵を作成する(今回は指定してない)

2019年の初頭頃に秘密鍵の形式が変わったらしく-m pemをつけずにssh-keygenを実行するとRaspbian(Kernel version:4.19)では新しい形式の秘密鍵が生成される

-----BEGIN OPENSSH PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----

ちなみに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を読み込む。

puTTYgen 0.73を起動する

パスフレーズを聞かれるので入力する。

パスフレーズの入力

鍵が読み込まれるので「Save private key」ボタンをクリックする。

鍵が読み込まれるのでSave Private keyで保存する

*.PPK(puTTY Private Key)形式で保存する。

保存したらpuTTYgenは終了する。

PPK形式で保存する

Windows上のpuTTY、WinSCPから接続する

puTTY、WinSCPで秘密鍵を指定して接続する。

接続方法は前述のセクションを参照の事。

秘密鍵の設定場所は以下の通り。

puTTY 0.73秘密鍵設定

sshd_configを編集してセキュリティを高める

最後にsshd_configファイルを編集してセキュリティを高める。

こちらについても前述のセクションを参照のこと。

以上でssh接続をパスワード方式から公開暗号化方式へ変更した時の記事は終了する。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

1件の返信

  1. 2020年7月3日

    […] 公開鍵ファイル名sshd_configで指定する(後述) […]

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。