ワンタイムパスワードにしてはどうでしょう。
OpenSSHにはChallengeResponseAuthenticationオプションがあります。
なりすましを排除したいなら、そもそもDHCPでIPアドレスを取得するようなクライアントを接続すべきでは無いと思います。
質問内容から察するに同一LAN内からのアクセス制限ですね?
であればMACアドレスは偽装できますしIPアドレスも変更できるのでそれで制限をかけるのは本質的には余り意味が無いかもしれません。
それよりもまず基本は公開鍵認証用の各人の秘密鍵をきちんと守ることでしょうね。
鍵の運用ポリシーとして、パスフレーズは必ず設定するとか、鍵長は長め(4096ビット以上)にするなどのルールを作って定期的に監査するのが有効だと思います。
サーバ側でできることとしてはProtocolは2のみ(今時はデフォルトがこうだと思う)、パスワード認証は無効にする。
あとは、ウィルスなどによる内部からの自動攻撃の対策としてはポート番号をデフォルトの22以外にするのも意外に有効だったりします。
あと更に基本的なことですが鍵付きの部屋やラック内におくことによる物理的なアクセス制限は必須ですね。
サーバへの物理的な接触ができたらrootログインも簡単だしサーバごとHDDを盗むことも簡単で、全ての対策が無意味になりますから。
▽3
●
JULY ●140ポイント ベストアンサー |
あと思いつくのは AllowUsers ぐらいかな。
順番に考えていきましょう。
まず、接続元となるクライアントを制限したい、ということであれば、すでに実践されているようですが、クライアント側の IP アドレスが特定できないのであれば、y-kawaz さんの回答にあるように、ある程度大きな単位で許可せざるを得ません。
たとえば、geoip を使って、国外からの接続を拒否する、というのをやっている例があります。
GeoIPでSSHに接続できる国を制限する - ts1の日記
ポート番号をデフォルトの物から変える、というのも一定の効果はあります。ただし、takihiro さんが誰かに狙われていない場合(^^;。多くのポートスキャンは、何か使えるホストがないかを探すだけなので、22 番以外で ssh サーバが動いていても素通りされます。ただ、もし本当に狙われている場合だと、ある TCP ポートが開いている事は分かる訳ですから、そのポートで何が動いているのかを詮索されると、SSH サーバである事が分かってしまう事になります。ポート番号を変更するのは、あくまでも「目くらまし」としての効果です。
あとは、そのユーザが信用できるか、ですが、ユーザの認証方式として公開鍵認証のみであれば、後は運用が大切、というは y-kawaz さんと同意見です。
で、公開鍵認証にプラスαするとしたら、PermitRootLogin が No であることは当然として、AllowUsers で制限しておけば、不用意にユーザが認証可能な状態になってしまう事を防げます。
あと、公開鍵認証のみにしている場合では問題ないのですが、ssh サーバが動いている、と分かると、ブルートフォースアタックがしつこく行われます。Red Hat 系であれば、/var/log/secure に、その記録が大量に残ります。このログは、パスワード認証を無効にしていても出力されます、で、接続の頻度を iptables で制限する事が可能です。
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -m hashlimit --hashlimit-name ssh --hashlimit-mode srcip --hashlimit 20/hour --hashlimit-burst 5 --hashlimit-htable-expire 3600000 -j ACCEPT
上記の設定は、同一ホストから1時間に 20 回、一時的には連続5回までで、制限に達した場合、3,600,000 msec = 1時間、接続を受け付けなくなります。パラメータは用途や運用状況によって変更する必要があると思いますが、こうしておくと、5回試しただけで、後はあきらめてくれるようになります。