SSHのクライアント認証

持ち歩くFreeBSDクライアントの方は一応DHCPと固定IPの複合で使えるようにしたので、他のPCからもSSHログインできるようにします。

この場合、接続場所によってサブネットが変わるのでIPフィルタでは大変です。それでクライアント認証を使い、ログインできる端末を制限します。

[Windowsで鍵生成]
Windows側で鍵を作成する場合はTeraTermを利用します。
ターミナル:Tera Term Professional Version 4.48 with Japanese resource
SSHクライアント:TTSSH ( Tera Term同梱)

日本語化バージョンで説明します。
(デスクトップが日本語・ノートが英語バージョン使っている変わり者です)

メニューの[設定]-[SSHキー作成]をクリックします。
キーの種類を選択し(今回はDSA)[生成]ボタンをクリックします。
しばらく待つと秘密鍵パスワードの設定が可能になりますので、パスワードを入れて[公開鍵の保存]と[秘密鍵の保存]でそれぞれ保存します。ここで作成された公開鍵をサーバに送ります。

[UNIX系で鍵生成]
# ssh-keygen -b 1024 -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_dsa):
保存場所を聞かれますがデフォルトでよければそのままEnter

Enter passphrase (empty for no passphrase):
秘密鍵パスワードを聞かれたらパスワードを入力。
これで秘密鍵(id_dsa)、公開鍵(id_dsa.pub)が生成されます。

[UNIXサーバ側の設定]
ログインするユーザのホームディレクトリの下に認証用の公開鍵をまとめるファイルを生成します。
最初のキーの場合はcpでも良いのですが、下記コマンドであれば新規・追加両方使えます。

> cat public_keyfile >> ~/.ssh/authorized_keys
通常公開鍵はid_dsa.pubなので

> cat id_dsa.pub >> ~/.ssh/authorized_keys
authorized_keysは複数の公開鍵を追加できるので、同じユーザ利用で他のクライアント用に別の秘密鍵を用いて認証することが可能です。

セキュリティ強化

必要なサービスは揃ったので最後の仕上げにセキュリティ強化を行う。
元々無駄は省いていたが残っているのが下記の項目

・不要なユーザー/グループの削除
・ログイン時のメッセージを削除
・SSHでログインできるユーザーを制限(posrgresとかでログインされないようにする)
・ファイヤーウォールでポートの制限をする

ユーザー管理は特に説明の必要はないですね。余計なユーザーアカウントがあるとクラッキングの対象にされます。BSDだとgameユーザーとかあるので消しましょう。

ログイン時に出るメッセージによってOSの種類やバージョンがバレます。すぐに編集しましょう。
対象になっているファイルは/etc/motdです。

SSHユーザーの制限は/etc/ssh/sshd_configにAllowUsersの項目を追加し
AllowUsers user1 user2のようにスペースを開けて記述します。

ファイヤーウォールは個別に紹介。

PAM: authentication error

リモートでSSHログインが出来ないから、BSDマシンがDHCPだとダメなのか?hosts.allowに書いてないとダメなのかとやってみましたが、実はローカルでやってもダメだった。そこで出たエラーが

PAM: authentication error

何ですかねこれ?

ググッてみたらこの文章。
Note: The configuration defaults for sshd(8) have been changed. SSH
protocol version 1 is no longer enabled by default. In addition,
password authentication over SSH is disabled by default if PAM is
enabled.

翻訳したらこうなる。
注意: sshd(8)のための構成デフォルトを変えました。 セキュアシェル (SSH)

プロトコルバージョン1はデフォルトでもう可能にされません。 さらに、PAMが
有効にされるなら、SSHの上のパスワード認証はデフォルトで無効にされます。

何ー!?仕様変更でパス認証が無効になっているのか?

/etc/ssh/ssh_config内において
PasswordAuthentication yes
を有効にした時点でサーバー自身からsshログインは可能になった。
さらに、/etc/ssh/sshd_configも同様に設定すると、リモートからログインが出来たーー!!