昨今の攻撃増加を考えると、Internet側からSSHでLinuxサーバにログインできる状態にしておくのは非常に危険だと考えられます。
しかし、敢えてSSHでのログインを許可する場合には、通常
- 公開鍵認証
- IPアドレス制限
- SSHポート番号の変更(22 -> 63000の様なポート番号変更)
で運用していると思います。
ただ、この場合にはPCの盗難等で公開鍵が漏れた場合には防ぎきれない可能性があります。また、運用状況に於いてはIPアドレス制限やSSHポート番号の変更が難しい場合もあると思います。
そこで、今回は、LinuxサーバのSSHに多要素認証を加え、よりセキュリティを担保しようと思います。具体的には、Google Authenticatorを使用します。
システム前提条件
システムは下記の様になっています。
- Ubuntu 22.04LTS
- 上述のOSに、リモートからSSHでログインすることを考えます。SSHでログインする際に、通常のパスワードに加えてスマホなどにインストールしたGoogle Authenticatorアプリから出力されるランダムな番号の入力が必須となり、アカウントのパスワードが漏洩してもシステムにログインされなくなるため、上述のシステムが堅牢になります。
システム側の設定
SSHでGoogle Authenticatorを有効化するには、Google Authenticator用のPAMライブラリ及びコマンドが含まれているパッケージ(libpam-google-authenticator)を使用します。以下、Ubuntu 22.04LTSでのインストールと有効化の手順です。
- aptを用いて、libpam-google-authenticatorをインストールします(apt install libpam-google-authenticator)。(図参照)
- /etc/pam.d/sshdを編集し、最下部の@include common-password行の下に「auth required pam_google_authenticator.so nullok」を加えます。nullokを加えることで、Google Authenticatorを設定していないユーザはパスワードのみでログインできますので、ユーザが全員Google Authenticatorを使用する状態になるまではこちらにしておきます。(図参照)
- /etc/ssh/sshd_configを編集し、「KbdInteractiveAuthentication yes」にします。(図参照)
- 「systemctl restart sshd」でsshdを再起動します。
ユーザ側での設定
次に、このシステムを利用する各ユーザで、SSHログインにGoogle Authenticatorが必要になるようにします。システムを利用している各ユーザごとが設定する必要があります。
- Google Authenticatorアプリを入れたスマホを準備します。
- まずはシステムに一回sshなどでログインしてコードを生成する必要があります。多要素認証を設定したいユーザ(例ではssh_test)でUbuntuにSSHログインし、「google-authenticator」コマンドを実行します。(図参照)
- 最初の「time-basedにしますか?」という所で(Google Authenticatorは時間ベースなので)yでEnterします。
- Terminal中にGoogle Authenticatorアプリで読み込むためのQRコードが表示されます。ここの箇所はうまくキャラクタベースでQRコードを作っているなと感心してしまいます。(図参照)
- 手持ちのスマホのGoogle Authenticatorアプリで、表示されているQRコードを読み込みます。読み込まれると早速コードが生成されますので、「Enter code from app」の所にコードを入力します。
- コードの確認(つまりQRコードを正しく読み込めたことの証明)が出来ると、Emergency Codeを5つ出力してくれますのでメモしておきましょう。「[ユーザのホームディレクトリ]/.google_authenticatorファイルを作成しますか?」と聞いてくるので”y”を選択します。(図参照)
- 以下の質問は、デフォルトのほうが安全ですので”y”を選択します。設定は後で変更できます。(図参照)
確認
- 以降、外部からsshクライアントでsshログインしようとすると、前述の手順でGoogle Authenticatorを設定したユーザの場合には、パスワードを入力した後にGoogle Authenticatorのコードの入力が必要になります。(図参照)