SSHの危険性
概要
本記事ではSSHに対する基本的な設定の種類と、それぞれに対する危険性について解説する。
SSHはネットワークに接続された別のサーバを遠隔で操作するためのプロトコルだ。実際にその端末の前にいかなくても遠隔で操作できることは、実務上大きなメリットがあり、どの現場でも使用しているだろう。
しかし、便利だからこそ攻撃者に狙われる。攻撃者からすれば本プロトコルを攻略すればそのままサーバを乗っ取れるからだ。
本記事では基本的なSSHの設定とその攻撃の種類について記載する。
パスワードによるログイン
まず前提条件として、クライアント側(10.0.2.10)、サーバ側(10.0.2.15)に分かれて実験を行う。
パスワードによるログインのプロセス
最も基本的なパスワードによるログインについて説明する。これは単純にIDとパスワードで認証を行う。
ドメイン, ID, パスワードさえ知っていれば世界中どこからでもログインできるため便利であるが、通常のプロトコルと同様に総当たり攻撃に弱い。
パスワードによるログインへの攻撃
IDとパスワードの組み合わせを攻撃者が知らなくても、総当たり(全ての組み合わせ)を試せばいつかログインできることになる。
今回はMetasploitのssh_loginモジュールを使用し、IDを固定(yuikura)し、よく使われるパスワード数千個を調査した。
調査の結果「yuikura:toor」が発見されたことがわかる。
今回は「toor」という脆弱な設定だったため短時間でパスワードを見つけられたが、多少複雑なパスワードに設定したとしても破られる可能性はある。対策としてはアカウントロックのような試行回数を制限する、IPSで連続したアクセスを遮断する等が考えられる。
しかし、どれほど強固なパスワードやアカウントロックを設定したとしても、別の個所で漏れたID/パスワードの組み合わせを使用される可能性がある(リスト型攻撃)。その場合は、これらの施策は突破される可能性が高い。そのため、近年はパスワードによるログインは推奨されていない。
公開鍵によるログイン
次に紹介する方法として公開鍵を使用したログインを紹介する。
公開鍵によるログインは、まずユーザが公開鍵/秘密鍵のセットを作成し、そのうち公開鍵をサーバに登録する。その後、ログイン時にサーバ側が公開鍵で暗号を作成し、ユーザに送信し、ユーザは秘密鍵を用いて解読することで、サーバは通信相手が正しいユーザであることを認識する。
本手法の良い点として、暗号は非常に桁数が多く乱数であるため、総当たりによる解読がほぼ不可能である点。また、通信経路上にパスワード等の機密情報が流れない点もセキュアである。
公開鍵によるログインのプロセス
では、実際の設定を見ていく。
まずはサーバ側でパスワードによる認証から公開鍵による認証に切り替える。
vim /etc/ssh/sshd_config
PubkeyAuthenticationをyesに変更し、PasswordAuthenticationをnoに変更しよう。
次はクライアント側の操作である。
まず秘密鍵と公開鍵をssh-keygenを使用し作成する。
これによりhomeディレクトリ配下に.sshディレクトリが作成され、その内部に秘密鍵「id_rsa」、公開鍵「id_rsa.pub」が作成された。このうち、公開鍵を「authorized_keys」に名前を変更している。
この公開鍵「authorized_keys」をサーバ側に送付する。
サーバ側は公開鍵を自身の.sshディレクトリに格納する(.sshやauthorized_keysは権限周りの設定が必要だが、今回は割愛する)。
これで、クライアント側、サーバ側の準備が整った。
クライアント側でサーバにアクセスする。
問題なくログインできたことが確認できる。
公開鍵によるログインへの攻撃
では、公開鍵によるログインは完全に安全なのか?
もちろんそうではない。
今回は2つの攻撃パターンについて解説する。
秘密鍵が漏れるケース
第一に考えられるのがユーザAの作成した秘密鍵「id_rsa」が攻撃者に盗まれるケースである。
サーバ本体と比較し、ユーザのラップトップは比較的セキュリティが脆弱なため、これは現実的な脅威だ。
しかし、単純に秘密鍵が盗まれてもすぐにサーバに侵入されるわけではない。攻撃者はその秘密鍵がどこのサーバを示しているか考えなくてはならない。
2つ方法がある。1つはOSINT的にユーザの関連するドメインを総当たりする方法。もう一つは.sshディレクトリに配置されているknown_hostsを総当たりする方法だ。known_hostsには前回と今回で相手の鍵が変わっているかを調査するものであり、本ファイルには過去に接続したドメインが記録されている。ただし、多くの場合はハッシュ化されている。
しかし、これらはローカルファイルであり、その暗号化ロジックも判明しているため総当たりが可能である。
このようにクライアントの端末に侵入されることで、普段接続しているサーバに入られる可能性がある。これを防ぐためにも、公開鍵によるアクセスでもパスワードを設定することをお勧めする。
公開鍵が入れ替えられるケース
次に公開鍵が入れ替えられるケースだ。
攻撃者が作成した鍵をサーバに配置することができれば、攻撃者は自身の秘密鍵で堂々とサーバにログインすることが可能になる。
この際の問題点として、どのようにサーバに攻撃者の公開鍵を配置するかだ。サーバに既にログインできるのなら、これらの方法は行う意味がない。
まず第一に考えられるのが限定された権限でログインできる場合だ。例えばFTPやSMBでのみログインできるとき、.sshディレクトリへの書き込みが可能であれば、公開鍵を配置することができる。また、Webアプリ等の脆弱性などによりリモートコードが実行できるのであれば、コマンドを用いて攻撃者の公開鍵を.sshに配置するようなこともできるだろう。
他の方法としてはフィッシングのようなやり方もあるかもしれない。つまり正式なユーザに成りすまし、公開鍵をサーバに登録させるなどである。
これらの攻撃を防ぐには.sshを正常にログインしたユーザ以外に書き込ませない対策や、公開鍵配置のプロセスに本人確認を挟む対策が求められる。
まとめ
今回はSSHの仕組みとその危険性について解説した。
今回紹介した仕組みや対策、攻撃は全体の一部であり、ぜひ自身で他の方法について調べてほしい。
また、SSHは便利であるが故に攻撃者にイの一番に狙われる個所だ。そのため不用意に外部に公開するプロトコルではない。どうしても外に公開する場合はパスワードによる認証ではなく、公開鍵による認証を勧める。またその際は秘密鍵の管理を厳格に行ってほしい。