2023/8/27 内容を更新しました。
2024/1/15 内容を追加し、更新しました。
結論
基本的には一般的なネットワークセキュリティの知識です。
自宅サーバーに固有な問題は
- グローバルIPアドレス問題
- 家庭用ネットワークとサーバーの共存
にあります。
- アプリケーション側のセキュリティ対策
- ネットワーク側のセキュリティ対策
- 自宅の家庭用ネットワークを攻撃から守る
これらについて、詳しく解説していきます。
自宅サーバーだからといって、セキュリティ対策論が根本的に変わることはありません。
はじめに
インターネットにサーバーを公開する場合、セキュリティ対策はとても重要です。
WEBサーバーを公開すると、何もコンテンツのない状態でも
一日数十件、悪いことを企んでるリクエストが飛んできます。
悪いことを企んでるHTTPリクエストのログの例
# wordpressのログインページへのアクセスを試みる
"GET /wp-admin HTTP/1.1" 404
"GET /login/wp-admin HTTP/1.1" 404
"GET /wp-login.php HTTP/1.1" 404
#phpMyAdminがありそうなパスを探してる (一部マスク)
"GET /XXX/phpMyAdmin/index.php?lang=en HTTP/1.1" 404
"GET /phpmyadminXXX/index.php?lang=en HTTP/1.1" 404
#wordpressのプラグインに入れるかを探してる。(一部マスク)
"GET /wp-content/plugins/XXXXX-phpmyadmin/XXXXX" 404
#認証画面があるか試してる。
"GET /auth.asp HTTP/1.1" 404
#gitリポジトリじゃないか試してる
"GET /.git/config HTTP/1.1" 404
80/443ポートの攻撃では、wordpressを攻撃することを狙う攻撃が多いです。
いろんなパスを試していますね。
アクセスできた場合の利得が大きいパスも狙われます。
これらのアクセスはBOTによるものだと思われます。
アクセス元を調べると、悪意のある攻撃者だけではなく、
セキュリティを調査している企業や団体(真偽不明)もあるようです。
注意点
How to というよりは一般論が多めです。
この記事を実践することで必ず不正アクセスを防止できるわけではありません。
基本原則
- ポートを開けない
- 公開するサービスを最低限にする
- 公開するサーバーを最低限にする
そもそもインターネットに繋がる物を最小限にしましょう。
外の世界につながる、ドアは少ないほうが安全です。
OSM参照モデル
階層 | 階層名 |
7層 | アプリケーション層 |
6層 | プレゼンテーション層 |
5層 | セッション層 |
4層 | トランスポート層 |
3層 | ネットワーク層 |
2層 | データリンク層 |
1層 | 物理層 |
基本的には、7~5層のアプリケーションに関する領域、
ネットワーク層のセキュリティ対策をこの記事で解説します。
アプリケーション層の対策
アプリケーション側での対策を最低限実施しましょう。
Minecraftサーバーでは以下のような対策が可能です。
- ログインできるプレイヤーを指定しておく
ホワイトリスト、ブラックリストを作る。 - プレイヤーの行動をログに残し、不正な行動がないか監視する
- 必要のないMODやプラグインを入れない
悪いやつをわざわざ内部に入れてしてしまう結果に。 - 信頼できる人にしかログイン情報を教えない
IPアドレス、ポート番号など
HTTPリクエストの例としての、
WordPressにおいては以下のような対策が一般的です。
- ログインURLの変更
圧倒的に/wp-adminや/wp-login等のログインURLを狙うことが多いようです。
configを変更するか、プラグインでログインURLを変更できます。
有名サイトでない限り、ログインURLを総当りされることは少ないかと思います。 - パスワードの強化
当たり前ですが、ありきたりなパスワードは避けましょう。
ランダムな英小文字/大文字/記号/を組み合わせて、大体14桁以上が推奨されます。
パスワードマネージャー等を活用し、無作為で長い文字列を生成し、設定する方法もあります。 - 余計なファイルがないか?
静的ファイルはファイル名を総当り、辞書攻撃で発掘される可能性があります。 - 危ないプラグインがないか?
プラグインの数だけ脆弱性を産みます。
有名プラグインでも脆弱性はありますし、過去の事例も多いです。
自作アプリやゲームサーバー等を公開する際も
十分にリサーチしてから公開しましょう。
一方で、どんなに対策しても、アプリケーションの脆弱性を完全に防ぐことは難しいです。
わざわざ外に公開しているので、当たり前といえば当たり前ですが。
ログを残す
基本的にはどんな行動でもログに残ります。
ログには攻撃や状況の手がかり、ソフトウェア障害の際にも有用です。
攻撃者に侵入された場合、ログを削除する行動を取る可能性があります。
そのため定期的に別領域にコピーしたり、ログの保存ディレクトリの権限を設定しましょう。
ログ管理にはkibana elasticsearch logstash
という3つのアプリケーションを連携させることが多いです。
fail2ban
一定時間内に、N回、ある行動をすると、N分、接続を拒否する。
といったような、ルールを設定できます。
例えば、5分間の間、10回、SSHにログイン失敗すると、30分接続を拒否する
などです。
後述のDDos攻撃にはあまり意味がありませんが、純粋なログイン攻撃には有効な対策です。
ソフトウェアファイアウォールの設定
UFWというソフトウェアにて、ファイアウォールを設定できます。
基本的にはホワイトリストの形式で設定します。
任意のポートを、任意の条件から、許可 / ブロックできます。
SSH(22)のポートをブロックする設定をすると、自分もログインできなくなるので注意しましょう。
バックアップ
最悪の事態を想定して、重要なファイルや、ゲームサーバーのデータはバックアップしましょう。
ネットワークが分離された、別筐体、別ホストにバックアップすることが理想です。
WEBサービス等の場合は、AWSのS3などの、クラウドに保存する事もできます。
ゲームデータの場合は、ファイルサイズが大きいため、クラウドに保存するという選択肢はコスト的に難しい場合も多いです。
サーバー監視体制
現在のサーバーの負荷や状態をいつでも視覚的に見られるようにします。
GrafanaやZabbix、Kibana
等のOSSアプリケーションがあります。
ネットワーク層での対策
ネットワークのセグメント分け
開発環境やNAS、ネットワークに公開しているサーバーがあった場合、
ネットワークを分けることで、万が一侵入された場合、被害をネットワーク内のみに収めることが期待できます。
ネットワーク仮想化
一般的には業務用ルーターや高機能ルーターに搭載されている機能です。
ルーター側で仮想的にLANのセグメントを分けます。
1台のルーターで複数セグメントを作成することが可能です。
業務用ルーターは、中古市場に安価で流通する傾向があるため、中古で入手するのも選択肢です。
一方でルーターの設定を変更されてしまうと、この仕組みは機能しません。
管理画面に接続できる手段には制限を設けましょう。
また、分離していたとしても、設定を変更する時や、ファイルを行き来する時など、セキュリティの穴が生まれるでしょう。
セキュリティを高めると、利便性は下がることが一般的です
脆弱性には気をつけよう!
脆弱性情報を常に収集しましょう。
以下に紹介するページは、脆弱性情報が注意喚起されるサイトです。
定期的にチェックすると良いでしょう・
外部に公開するサービスを絞ることでも対策できます。
数年に一度、重大な脆弱性が明らかになる傾向にあります。
OSやアプリケーションは、可能な限り最新版を使ったほうが良いです。
しかし、完全に脆弱性を防げるわけではありません。
自宅IPがバレるとまずいこと
今回は固定IPを何らかの手段で取得した前提で解説します。
DOS/DDos攻撃
特にゲームサーバーで多い攻撃です。
嫌がらせ、ライバル潰し、面白半分等の動機で、大量のリクエストが飛んできます。
攻撃ツールは容易に入手できるため、攻撃者側の難易度は低いのです。
悲しいことに、ddos攻撃はサーバー管理者側で根本的な解決はできないのです。
自宅IPアドレスがバレないようにする仕組み
リバースプロキシとは
リバースプロキシ未使用の場合
攻撃が自宅のネットワークに直撃します。
あまりにも通信が多い場合、ISPから警告が届く場合があるそうです。
リバースプロキシを使うと
ユーザーからはリバースプロキシのIP 123.123.123.123しか見えなくなります。
実際はリバースプロキシがかわりに自宅サーバーにリクエストを行い、ユーザーに渡します。
nginxでの設定の注意
Nginxでリバースプロキシを設定する場合、下のIPアドレスがレスポンスに伝搬してしまうことがありますので、設定にはご注意ください。
適切に設定が適応されているか、確認しましょう。
全て解決なわけじゃない
自宅のネットワークが無事なだけで、リバースプロキシ側のサーバーには負荷がかかります。
リバースプロキシを挟む場合、攻撃を受けても被害はリバースプロキシ側のみで済みます。
しかし、攻撃を察知の上で、攻撃を遮断しないと、普通に攻撃が自宅まで到達します。
別の利点
また副次的な効果として、通常サーバーが落ちてる際はConnection Errorとなる一方
リバースプロキシがあると、コンテンツは提供できないですが、例えば
「ただいまメンテナンス中です~」のような、リクエストを返すことができます。
Cloudflare Tunnel
基本的には443ポートをCloudflare を通して公開できるサービスです。
Cloudflare にドメインを登録する必要はありますが、無料で十分に利用できます。
Ngrok
任意のポートをトンネリング技術で外部に公開できます。
無料プランだとURLが固定できないため、毎回サーバーのURLを伝える必要があります。
VPN | SoftEther VPN WireGurd
自分でVPNサーバーを立てて、自宅とVPSを接続します。
VPSと自宅が、仮想的にネットワークとして接続されるため
自宅のグローバルIPアドレスを外部に晒す心配は低いです。
設定に少し手間がかかります。
SoftEther VPNと比べると、WireGurdの方が導入難易度が低くおすすめです。
アクセス制限
SSHなどのリモートアクセスできるポートは、
そもそも外部には開けないことを推奨します。
事前にユーザーを認証する仕組みがあるとよいです。
自宅ネットワーク内にVPNを構築する方法もあります。
攻撃からサーバーを守る観点では、海外からのアクセスを禁止する方法もあります。
・・がDDos攻撃には機能しない場合があります。
IPが海外なら、捨てるという処理が行われます。
そのため、多数のリクエストだと機器や回線に負荷がかかります。
しかしWEBサイトの場合には、Googleなどのクローラーも巻き添えになります。
またDiscordBotやTwitterBot等も記事を取得できなくなります。
身内だけの少人数、ゲームサーバーの場合などは設定しておくとマシだと思います。
結論
セキュリティを徹底することで、快適な自宅サーバー生活を楽しみましょう!
自宅サーバーのセキュリティ対策は、一般的な環境でも通用できるスキルとして役に立ちますよ!
ここまで閲覧頂きありがとうございます!
コメント