SSHのクライアント制限について


SSHサーバを運用しており、特定のクライアントホストにのみSSHの機能を提供しようとしています。SSHサーバはOpenSSH 5.9です。現在、以下の制限を設けています。
* 公開鍵認証のみ許可(クライアントホストで作成した公開鍵をSSHサーバに登録)
* クライアントホストのIPを/etc/hosts.allowやiptablesで制限

この構成上で、以下の2点について、お教えいただければと思います。
(1) さらにセキュリティを高める方法がもしあれば(MACアドレスで制限するなど)
(2) クライアントホストがDHCPでIPを設定している場合、IP制限をどのように代替すればよいか

よろしくお願い致します。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/12/23 21:53:23
  • 終了:2011/12/26 13:06:01

ベストアンサー

id:JULY No.3

JULY回答回数966ベストアンサー獲得回数2472011/12/24 12:11:14

ポイント140pt

あと思いつくのは 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回試しただけで、後はあきらめてくれるようになります。

id:takihiro

ご回答、ありがとうございました。

GeoIPや/etc/hosts.allowでのaclexec設定など、初めて知りました。ありがとうございます。

ポート番号については、nmapなどで簡単に検出できることは存じておりました。

ブルートフォースアタックの対応についても、ディスク溢れを防ぐのに重要そうですね。参考にさせて頂きます。ありがとうございます。

2011/12/24 13:39:57

その他の回答(2件)

id:kodairabase No.1

kodairabase回答回数661ベストアンサー獲得回数802011/12/23 22:15:26

ポイント20pt

(1) さらにセキュリティを高める方法がもしあれば

ワンタイムパスワードにしてはどうでしょう。
OpenSSHにはChallengeResponseAuthenticationオプションがあります。

(2) クライアントホストがDHCPでIPを設定している場合、IP制限をどのように代替すればよいか

なりすましを排除したいなら、そもそもDHCPでIPアドレスを取得するようなクライアントを接続すべきでは無いと思います。

id:takihiro

ご回答ありがとうございます。

(1)について、公開鍵認証のみの運用のため、記載頂いたオプションはnoにしておりました。

(2)について、ご指摘ありがとうございます。ただ、運用上、DHCPでIPを取得するクライアントから接続することもありますので、できる範囲でセキュリティを高めたいと考えています。

2011/12/23 22:31:33
id:y-kawaz No.2

y-kawaz回答回数1421ベストアンサー獲得回数2262011/12/23 22:21:27

ポイント140pt

質問内容から察するに同一LAN内からのアクセス制限ですね?
であればMACアドレスは偽装できますしIPアドレスも変更できるのでそれで制限をかけるのは本質的には余り意味が無いかもしれません。

それよりもまず基本は公開鍵認証用の各人の秘密鍵をきちんと守ることでしょうね。
鍵の運用ポリシーとして、パスフレーズは必ず設定するとか、鍵長は長め(4096ビット以上)にするなどのルールを作って定期的に監査するのが有効だと思います。

サーバ側でできることとしてはProtocolは2のみ(今時はデフォルトがこうだと思う)、パスワード認証は無効にする。
あとは、ウィルスなどによる内部からの自動攻撃の対策としてはポート番号をデフォルトの22以外にするのも意外に有効だったりします。

あと更に基本的なことですが鍵付きの部屋やラック内におくことによる物理的なアクセス制限は必須ですね。
サーバへの物理的な接触ができたらrootログインも簡単だしサーバごとHDDを盗むことも簡単で、全ての対策が無意味になりますから。

他5件のコメントを見る
id:y-kawaz

まぁ、実際にはそれなりにお金もかかって面倒なので普通の人はそこまでしないと思うので、それなりの制限としては使えはします。なので、
> DNSの逆引きでの制限はやめたほうが良いですね。
というのは言い過ぎで、それに頼り切らない方が良いです、くらいのニュアンスです。

でもさらに言えばそもそも動的IPのアドレス範囲での制限というのも、許可されている人と同じISPに加入すれば同じIPアドレス帯のIPを自分が使うことができてしまう、というとても単純な穴があります。
固定IPをくれるISPなんていくらでもあるので、セキュリティを考えるなら接続元に固定IPを取得してもらうのが一番でしょうね。

2011/12/24 14:57:34
id:JULY

>月数百円~数千円程度で固定IPと逆引き設定が手に入れられる
>今の世の中では十分に「誰でも」といえるんじゃないでしょうか?

私が「誰でも」という言葉に違和感を感じたのは、「任意の IP アドレスに対して」誰もが逆引きを設定出来る、という印象にならないかなぁ、と思った次第です。

... という事を、y-kawaz のコメントで認識出来ました(^^;。

例え数百円でも、ある IP アドレスを「買った」状態であれば、その IP アドレスに対する上位ゾーンの持ち主が許可すれば、逆引きを設定出来ますが、例えば、19.194.106.59.in-addr.arpa の PTR レコードを、全くの第3者が設定出来る訳ではありません(ちなみに、今、www.hatena.ne.jp を正引きした結果の IP です。で、この逆引きには PTR レコードは設定されていませんでした)。

今、ポイントになっているのが「つないで来た相手の IP アドレスが、本当に想定しているユーザの物か?」という点なので、「全く別な人が、その人が固定的に使っている IP アドレスにの逆引きに、同じドメイン名を設定する事が可能なので当てにならない」という点で、y-kawaz さんの言う通りです。

私が違和感を感じたのは、より広い意味で「逆引きなんて無法地帯で、誰でも好き勝手に出来ちゃうんだから」という雰囲気に読んでしまったためでした。

逆引きを使うなら、UseDns を yes にすれば、逆引きして得られたドメイン名を正引きして得られた IP アドレスと、元の IP アドレスが合っているかを確認する、という動きになるので、y-kawaz さんが心配されているケースは、これで防げる事になります。もし、それでもなお、つないで来た相手が第3者だったとしたら、本来の持ち主の DNS サーバがやられちゃっていることになります。

http://www.unixuser.org/~euske/doc/openssh/jman/sshd_config.html

2011/12/24 22:30:25
id:JULY No.3

JULY回答回数966ベストアンサー獲得回数2472011/12/24 12:11:14ここでベストアンサー

ポイント140pt

あと思いつくのは 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回試しただけで、後はあきらめてくれるようになります。

id:takihiro

ご回答、ありがとうございました。

GeoIPや/etc/hosts.allowでのaclexec設定など、初めて知りました。ありがとうございます。

ポート番号については、nmapなどで簡単に検出できることは存じておりました。

ブルートフォースアタックの対応についても、ディスク溢れを防ぐのに重要そうですね。参考にさせて頂きます。ありがとうございます。

2011/12/24 13:39:57

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません