こんにちは!インフラやセキュリティの世界へようこそ。
初めてサーバーに触れるとき、「何から手をつけていいんだろう?」と不安になりますよね。黒い画面(CUI)に文字を打ち込むだけでもドキドキするのに、「サーバーの要塞化(ハーデニング)」なんて言われると、なんだかものすごく難しそうに感じるかもしれません。
でも、安心してください。セキュリティの基本は、私たちが普段やっている「家の防犯」と全く同じなんです。今回は、Linuxサーバーの足元を固める第一歩として、「使っていない不要なネットワークプロトコルをカーネルレベルで封じ込める方法」を、一緒に優しく紐解いていきましょう!
—
1. 家の防犯に例えて考えてみよう:使っていない「勝手口」は閉めるべき
皆さんが一戸建ての家を建てたと想像してください。玄関には頑丈な鍵をかけますよね。では、勝手口や、普段は絶対に使わない2階のバルコニーの窓はどうでしょう? 鍵が開けっぱなしになっていたり、そもそもガラスが薄かったりしたら……泥棒は「玄関が無理なら、あそこの勝手口から入ろう」と狙ってきます。
Linuxサーバーもこれと全く同じです。
サーバーには、インターネットと通信するための様々な「道路(プロトコル)」が最初から用意されています。私たちが普段よく使うのは TCP や UDP という道路ですが、それ以外にも IPv6 や、あまり聞き慣れない DCCP、SCTP といった、マイナーな道路(プロトコル)がカーネル(OSの心臓部)のなかに標準で開通しています。
もし、あなたのシステムで IPv6 を使っておらず、DCCP や SCTP なんて一生使わないとしたらどうでしょうか?
攻撃者は、私たちが普段監視しているメインの道路(TCP/UDP)を避けて、誰も気に留めていないマイナーな裏道から不正な攻撃データを送り込んできたり、カーネルの未知の脆弱性(バグ)を突いてサーバーを乗っ取ろうとしたりします。
「使っていないなら、そもそも道路ごと封鎖してしまえばいい!」
これが、今回行うカーネルレベルでの不要プロトコル無効化(ブラックリスト化)の考え方です。
—
2. ターゲットにする「使わないプロトコル」たち
今回、私たちのサーバーから「出入り禁止」にする不審者候補(プロトコル)は以下の3つです。
1. IPv6: 現在の主流である IPv4 ではなく、次世代のIPアドレス規格ですが、社内ネットワークやクラウドの設計上、完全 IPv4 のみで運用している場合は不要です。
2. DCCP (Datagram Congestion Control Protocol): ストリーミング配信などで使われることが想定されたプロトコルですが、一般的なWebサーバーやDBサーバーではまず使いません。過去にカーネルの脆弱性が狙われた歴史もあります。
3. SCTP (Stream Control Transmission Protocol): 主にtelecom(通信キャリア)分野などで使われる高機能なプロトコルですが、通常のWebシステムでは不要なことがほとんどです。
これらを、Linuxの心臓部であるカーネルに「このモジュールは今後一切読み込ませない!」と強く言い聞かせていきます。
—
3. 実践!カーネルレベルでプロトコルをブラックリスト化する手順
それでは、実際にサーバーの設定をしていきましょう。
作業を行うときは、必ず管理者権限(root ユーザー、または sudo が使えるユーザー)で行ってくださいね。一歩ずつ、安全に進めていきましょう。
ステップ1:ロードされないようにモジュールをブラックリストに登録する
Linuxには、必要な機能を後からパーツ(モジュール)として読み込む仕組みがあります。使いたくないプロトコルが勝手に読み込まれないよう、設定ファイルを作成してブラックリストに登録します。
お好きなテキストエディタ(ここでは vi や nano など)を使って、/etc/modprobe.d/ ディレクトリの下に専用の設定ファイルを作りましょう。ファイル名は分かりやすく blacklist.conf などにします。
# root権限で設定ファイルを作成・編集します
sudo nano /etc/modprobe.d/blacklist.conf
開いたファイルの中に、以下の設定を記述して保存してください。
# ==========================================
# 不要なネットワークプロトコルのブラックリスト化
# ==========================================
# 1. DCCPの無効化(使用しない場合)
install dccp /bin/true
blacklist dccp
# 2. SCTPの無効化(使用しない場合)
install sctp /bin/true
blacklist sctp
# 3. IPv6の無効化(IPv4のみで運用する場合)
# ※ネットワークカードでIPv6を完全に無効化する設定と併用するとより確実です
install ipv6 /bin/true
blacklist ipv6
ここで登場する /bin/true という見慣れないコマンドは、「このプロトコルを読み込もうとしたら、何もせずに『成功したよ』と嘘をついて、実際には何もしない(=読み込ませない)」というLinuxのちょっとしたテクニック(泥臭いハック)です。
ステップ2:IPv6をカーネルパラメータ(sysctl)でも完全に黙らせる
IPv6に関しては、モジュールのブラックリスト化だけでなく、OSのパラメータ(sysctl)をいじって、ネットワーク層でも完全に無効化しておくとさらに鉄壁になります。
新しい設定ファイル /etc/sysctl.d/99-disable-ipv6.conf を作成します。
sudo nano /etc/sysctl.d/99-disable-ipv6.conf
以下の内容を書き込んで保存してください。
# ==========================================
# IPv6をカーネルパラメータレベルで完全無効化する設定
# ==========================================
# すべてのネットワークインターフェースでIPv6を無効化
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
設定を保存したら、OSにこの新しい設定を今すぐ反映させます。以下のコマンドを実行してください。
# sysctlの設定を即時反映させる
sudo sysctl --system
これで、カーネルはIPv6のパケットを受け付けなくなります。
—
4. 設定がうまくいっているか確認しよう
セキュリティ対策で一番大切なのは、「設定して終わり」ではなく、「ちゃんと意図通りに効いているか確認すること(Verify)」です。
サーバーを再起動する前に、現在の状態を確認してみましょう。
例えば、無効化したはずの sctp モジュールが現在ロードされていないか確認するには、以下のようにコマンドを叩きます。
# sctpモジュールが読み込まれていないか確認
lsmod | grep sctp
もし何も表示されなければ、無事にメモリ上に読み込まれていない(=安全な状態である)証拠です!
最後に、サーバー全体を一度再起動(sudo reboot)し、再起動後も問題なくシステムが立ち上がり、不要なプロトコルが完全に封じ込められていることを確認してください。
—
まとめ:小さな積み重ねがサーバーを守る
今回は、Linuxサーバーにおける「不要なネットワークプロトコルの無効化」について解説しました。
「たったこれだけ?」と思われるかもしれませんが、こうした不要な出入口を一つひとつ塞いでいく地道な作業こそが、サイバー攻撃者から狙われにくい「堅牢なサーバー」を作り上げる最大の秘訣です。
難しそうなセキュリティ用語も、身近な防犯に置き換えてみると、やるべきことがクリアに見えてきますよね。
一歩ずつ、確実に知識と技術を身につけて、自信を持ってインフラを守れるエンジニアになっていきましょう!それでは、また次のセキュリティ解説でお会いしましょう。
コメント