本記事はプロモーションを含みます
VPSは自由にサーバーの設定を変更できて費用も専用サーバーと比較して大幅に安く利用できるため、サーバー用途としてLinux VPSを中心に人気があります。
弊社でもVPSを活用しており、アプリサーバーやファイルサーバーなどに利用しています。しかし手軽にVPSを利用できる一方で世界中どこからでもアクセスできる状態のため、セキュリティー対策を行わないと非常に危険です。
自分のサーバーは重要な情報などないから大丈夫、そう思っている場合は改めてください。サーバーに侵入されると違法なファイルの置き場にされたり攻撃の拠点にされたりする場合があります。
その場合、身の潔白を証明する事は非常に面倒な事になります。ですから、インターネットからアクセス可能なサーバーを運用する場合は常にセキュリティーに注意を払い、攻撃の予兆をチェックしたり既に侵入されていないかチェックしたりするべきです。
本記事では攻撃の予兆を見つけたり、既に侵入されたりしている場合に早急に気付く方法について初心者の方向けに解説します。
サーバーに侵入される覚悟をしておく
インターネットでは常に攻撃者が有利です。
なぜならば、サーバーやネットワークを運用する方はあらゆる対策をしなければいけませんが、攻撃者は穴をひとつでも見つければ、そこから侵入してくるからです。システムの規模が大きくなるほど守るべき箇所が多くなるため、小さなものも含めれば穴がないシステムはほとんどありません。
サーバーに侵入された場合、よほど高度なスキルを持った攻撃者でない限り何らかの痕跡を残しますので、小さな痕跡も見つけ出せるように日々の運用をしましょう。
大前提:管理者権限を奪取されている場合はすべて信頼できなくなる
もし管理者権限を奪取されている場合(Linuxの場合はroot権限)、あらゆるものが信頼できなくなります。
たとえばログは改ざんされている可能性があるため、アクセスログにIPアドレスが記録されていても本当にそれが攻撃者のものなのか分かりません。もしかしたら無関係なIPアドレスに置き換えられている可能性があります。
カーネルルートキットをインストールされている場合は最悪です。
Linuxはカーネルに変更を加える事なく機能を拡張できるカーネルモジュールという機能をサポートしています。攻撃者が不正なカーネルモジュール(カーネルルートキット)をインストールしている場合、それはシステムコールを乗っ取られているという事です。
システムコールを乗っ取るという事は、画面への表示やキーボードからの入力、ファイル操作やネットワーク通信の入出力などすべてが攻撃者の意のままになるという事です。
そのため、ルートキットをインストールされたマシンではlsコマンドの結果を改ざんしてファイルを隠したり、自由に権限昇格したり、SSHのような暗号通信を傍受したりできるようになります。
管理者権限を奪取されているという事はOSを再インストールしない限り安心できない状態であるという点を忘れないでください。
不正アクセスの兆候を掴む
怪しいOSログを見つける:システムログ・監査ログをチェック
アクセス履歴は以下のファイルに記録されています。ただし、ディストリビューションによって記録されるファイルは異なります。
また、syslog設定によって記録されるファイル名が異なる場合があるので注意してください。
- /var/log/messages
- /var/log/syslog
- /var/log/secure
- /var/log/auth.log
- /var/log/audit/audit.log
チェックポイント
ログをチェックする際は次の点に注意します。
- 追加した覚えがないユーザーがログインしていないか
- ログインできないはずのユーザー(httpdなど)がログインしていないか
- 普段ログインしないユーザーがログインしていないか
- 海外など身に覚えのない送信元からログインしていないか
- VPSのIPアドレスからログインしていないか
ユーザーを追加できるのは通常は管理者権限を持ったユーザーのため、もしも身に覚えのないユーザーが追加されていたら管理者権限を奪取されている可能性があります。
また、ログインシェルが/sbin/nologin
に設定されていてログインできないはずのユーザーがログインしている場合、ログインシェルを変更されている可能性があります。もしもログインシェルを変更されている場合、管理者権限を奪取されている可能性があります。
明らかに怪しいログ
もしもログアウトが記録されているのにログインの記録がない場合、攻撃は管理者権限を奪取している可能性が高いです。
不正ログイン後に自らのログイン記録を削除し、その後ログアウトするとシステムログや監査ログにはログアウトだけ記録されます。
ログアウトだけ記録されている場合は攻撃者がログを削除している可能性が高い
VPSのIPアドレスもしくは127.0.0.1からログインされていないか
もしもログイン履歴のIPアドレスにVPS自身のIPアドレスや127.0.0.1がある場合、2つの原因が考えられます。
- 攻撃者が最後のログイン履歴を隠すためにVPS上でVPSにログインした
- ポート転送を使ってアクセス制限を回避しログインした
サーバーにログインすると前回のログイン履歴(IPアドレスと日時)が表示されますが、これを隠すためにVPS上でVPSにSSHログインする事があります。
また、SSHのアクセス制限を回避する目的でポート転送によりログインをおこなう場合があります。ポート転送を利用したアクセス制限の回避は次の記事をご覧ください。
さくらのVPSのパケットフィルターは無効化した方が良い理由怪しい挙動:ログ出力が止まっている
ときどき遭遇するのがsyslogを停止させる攻撃者です。
乱暴なやり方ですが、ログの改ざんなどが面倒でsyslogプロセスを停止させる場合があります。もしもログ出力が止まっている場合は攻撃者がsyslogを停止した可能性があります。
syslogを停止されている場合、管理者権限を奪取されている可能性があります。
侵入の痕跡を見つける:ログイン履歴をチェック
Linuxへのログイン履歴はlastコマンドで確認できます。また、最後のログイン履歴はlastlogコマンドで確認できます。
last、w、whoコマンド
lastコマンドはログイン履歴を表示し、wとwhoコマンドは現在ログインしているユーザーを表示します。
もしも攻撃者が管理者権限を奪取していない、あるいは身を隠す術を知らない・身を隠す気がない場合は次のファイルに記録されます。これらのファイルはバイナリファイルなので、直接ファイルの中身を表示させることはできません。
- /var/run/utmp
- /var/log/wtmp
/var/run/utmp
は現在ログインしているユーザーが記録されており、/var/log/wtmp
はログイン履歴が記録されています。
攻撃者がログを改ざんしている場合
古くから/var/run/utmp
と/var/log/wtmp
を改ざんするツールが攻撃者の間で出回っています。種類はいくつかありますが、有名なのはzapと呼ばれるログクリーナーです。
このツールは非常に単純なツールで、/var/run/utmp
や/var/log/wtmp
を検索して削除したいユーザーのログイン履歴をゼロで埋めます。そのため、/var/run/utmp
や/var/log/wtmp
がゼロで埋められている箇所があるかチェックするとログの改ざんを検出できます。
弊社ではdumputmpという簡易ツールを提供しています。興味のある方は以下のページをご覧ください。
https://netwiz.co.jp/dumputmp/
lastlogコマンド
lastlogコマンドは各ユーザーの最後のログインを表示します。ユーザーがログインする度に/var/log/lastlog
が更新されるため、定期的にlastlogコマンドを実行すると不審なログインを検出できます。
ただし管理者権限を奪取されている場合、このファイルは改ざんされます。
先ほど解説したzapというツールを使うと、自動的に/var/log/lastlog
ファイルから指定したユーザーの履歴を削除します。また、lastlogコマンドには履歴を削除するオプションもあるので、管理者権限を奪取されている場合はlastlogの結果は信頼できなくなります。
鍵認証を有効にしている場合(デフォルト有効)、攻撃者が.ssh/authorized_keys
に自分の公開鍵を追加している事があります。
OSコマンドインジェクションなどの脆弱性があると真っ先に狙われるので注意してください。見慣れない鍵が追加されている場合は既にシェルアクセスを奪取されている可能性が高いです。
攻撃の予兆:WEBアプリのアクセスログをチェック
WEBアプリを動かしている場合はアクセスログだけでなくエラーログも重要です。
異常終了したエラーコード
エラーコード500が発生している場合、攻撃者がWEBアプリの脆弱性を見つけた可能性があります。
エラーコード500はサーバー側で予期しない動作が発生した事を示すもので、WEBアプリで何らかのエラーが発生しています。
WEBアプリを開発する際はユーザーがどのようなパラメーターを入力したとしても適切に処理するようにエラーハンドリングします。そのため通常であればエラーコード500が発生することはありません。
しかしエラーコード500が発生したという事はWEBアプリが適切に処理できなかった(異常終了した)、という事です。
その場合、攻撃者が入力したパラメーターが原因でエラーが発生したのであれば、何らかの脆弱性を発見されている可能性があります。
OSコマンドインジェクションやSQLインジェクションの脆弱性を見つける過程では特にエラーコード500が発生しやすくなります。
ApacheやNginxのエラーログにエラーコード500が出ていないかチェックする
有効な対策について
まずはできる事からはじめましょう。
WAFを使う
WEBアプリケーションの攻撃を防ぐ目的で導入できる有効な手段のひとつがWAFです。
WAFはWeb Application Firewallの略で、WEB版のファイアウォールです。
WAFを使うと一般的な攻撃の多くを検出・防御できるため、もしも自作のWEBアプリケーションを開発して公開している場合はWAFの導入を強くおすすめします。
多くのVPSでは有料でWAFを提供していますが、さくらのVPSであれば「SiteGuard Server Edition」を無料で利用できるため、さくらのVPSを利用している方はWAFの利用を検討してください。
適切なアクセス制限をする
SSHによるリモートログインはIPアドレスで制限する事をおすすめします。できればOSのファイアウォール機能を使い、内向けだけでなく外向けの通信も制限してください。
Linux VPSでIPアドレス制限をする複数の方法を解説|さくらのVPSは要注意WordPressの管理画面へのアクセス制限は.htaccessを使ったIPアドレスによる制限がおすすめです。
なお、.htaccessファイルは仮にWEBアプリを乗っ取られても(OSコマンドインジェクションの脆弱性があっても)書き換えられないように、ファイルの所有者をrootにしておくと安心です。
普段利用しているISPが固定IPアドレスサービスを提供していれば、それを使ってIPアドレス制限をしてください。わたしのおすすめはVPNを使った固定IPアドレスの利用です。
VPNによるIPアドレスの固定化は自宅だけでなく外出先や旅行先でも同じIPアドレスを利用できるので、サーバーやWEBサイトの管理をする方はVPNによるIPアドレスの固定化をおすすめします。
VPNで固定IPを手に入れる|サーバー管理におすすめのVPNサービスログを別のサーバーに転送する
ログを改ざんから守ったり改ざんされた箇所を特定したりする有効な方法のひとつはリモートサーバーにログを送信することです。ログの送信方法と受信方法は次の記事で解説しています。
rsyslogでログを送受信する設定方法を分かりやすく解説システムログだけでなくApacheやNginxで取得できるアクセスログ・エラーログをリモートに保存しましょう。
syslogサーバーを構築する際はセキュリティーには特に注意してください。ユーザー名やパスワードを使い回してsyslogサーバーに簡単にログインできてしまう環境もありますが、それでは意味がなくなります。
できればリモートログインは不可にして、ログインして操作する必要がある場合はコンソールでログインするようにしておくと安心です。
VPSでコンソールからログインする方法を解説コンソールログインに絞る事が難しい場合はSSHなどを許可する必要がありますが、ユーザー名やパスワードを使い回したり鍵認証でパスフレーズなしにログインしたりする事は絶対にやめてください。
ログローテーションで保存数を増やしておく
ストレージサイズに余裕があればログを可能な限り長く保管してください。たとえばrsyslogであれば/etc/logrotate.d/rsyslog
でログのローテーション設定がされています。
/var/log/syslog /var/log/mail.info /var/log/mail.warn /var/log/mail.err /var/log/mail.log /var/log/daemon.log /var/log/kern.log /var/log/auth.log /var/log/user.log /var/log/lpr.log /var/log/cron.log /var/log/debug /var/log/messages { rotate 4 weekly missingok notifempty compress delaycompress sharedscripts postrotate /usr/lib/rsyslog/rsyslog-rotate endscript }
上記はデフォルト設定のためrotate 4
となっています。ログの更新はweekly
なのでデフォルト設定だと過去4週間分のログが保管されます。
可能であればrotate 4
の値を増やしましょう。弊社ではrotate 60
に変更して過去1年以上のログを保管するようにしています。
SSHログインするたびにメールで知らせる
地味だけれど有効な対策のひとつがリモートでログインした際にメールで知らせる事です。WEBシェルを設置されているとかSSHでない方法でリモートログインされている場合は検知できませんが、少なくてもSSHでログインされた際は確実に検知できます。
この方法はログインした瞬間にメールが飛ぶのでリアルタイムで検知できます。
LinuxサーバーへSSHログインした時にメールで知らせる方法まとめ
Linuxサーバーは適切に管理していれば不正なログインの大半を防ぐ事ができますが、ひとつでも穴があれば簡単に侵入されます。
これからLinux VPSを使う予定の方や既に利用されている方はセキュリティーに注意を払ってサーバーを運用してください。
少々手間はかかりますが、問題が発生した後の対処に比べればセキュリティー対策の方が楽なのは確実です。
よくある質問
- SSHのログインポートを変更しておけばSSH経由で侵入されませんか?
- SSHのポートを変更すると自動攻撃はほとんど来なくなります。しかし公開しているWEBアプリに脆弱性がある場合はポートを変更しても意味がありません。
- 鍵認証だけを有効にしておけばSSH経由で侵入されませんか?
- むしろ鍵認証の方が侵入されやすいです。個人的にはWEBアプリを公開している場合は鍵認証を無効化して強固なパスワードを設定した方がセキュアだと思います。
- 侵入された場合、VPSサービス会社でどのような対応をしてくれますか?
- 各社で対応が異なりますが、さくらのVPSの場合は強制的にパスワードを変更したりアクセスできないようにブロックしたりします。
警察への被害届などはご自身で行う必要があります。