ufwファイアウォール

通す番号を、こちらから決める

ここまでで、入口の扉は締めました。次は、そもそもどの番号への接続を受け付けるかを決めます。これがファイアウォールの仕事です。

考え方は権限最小と同じです。全部を開けておいて危ないものを塞ぐのではなく、全部を閉じておいて必要なものだけ開ける。前者は塞ぎ忘れがそのまま穴になりますが、後者は開け忘れても不便になるだけで、危険にはなりません。

Debian で使うのは ufw です。名前は uncomplicated firewall の略で、その名のとおり、細かい仕組みを覆い隠して数行で書けるようにした道具です。

まず既定を決める

ufw default deny incoming ufw default allow outgoing

入ってくる接続は既定で拒む、出ていく接続は既定で許す、という宣言です。サーバーが自分から取りに行く通信、たとえば apt でのパッケージ取得は出ていく側なので、こちらは許しておきます。

開ける番号を足す

ufw allow 22/tcp ufw allow 80/tcp

22 は SSH、80 は HTTP です。番号のうしろの /tcp は、そのプロトコルに限る指定です。付けなくても動きますが、付けたほうが意図がはっきりします。

順番を間違えると自分が締め出される

ここが今回のいちばんの勘どころです。有効にする前に、必ず 22 番を先に許可します

ufw allow 22/tcp # 先にこれ ufw enable # そのあとでこれ

逆にすると、既定の deny が効いた瞬間に自分の SSH 接続も拒まれます。手元の VM ならやり直せますが、遠くにあるサーバーでは物理的に触れない限り復旧できません。実際によくある事故です。

ufw enable を打つと、いま繋がっている接続が切れるかもしれない、という警告が出て確認を求められます。あの警告はこの事故を指しています。

いまの状態を読む

ufw status verbose
Status: active Default: deny (incoming), allow (outgoing), disabled (routed) To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere 80/tcp ALLOW IN Anywhere

verbose を付けると既定の方針まで出ます。付けないと規則の一覧だけになるので、「既定が deny になっているか」を確かめたいときは必ず付けてください。

Anywhere は、どこからの接続でも許す、という意味です。接続元を絞りたいときは、こう書けます。

ufw allow from 203.0.113.10 to any port 22

決まった場所からしか運用しないなら、SSH はこの形にしておくと守りが一段強くなります。

規則を消す

ufw status numbered ufw delete 2

番号を振って表示させ、その番号で消します。消すと番号が振り直されるので、複数消すときは大きい番号から消してください。小さいほうから消すと、あとの番号がずれて別の規則を消します。

手を動かす

既定を拒否に切り替え、SSH と HTTP だけを通す状態にします。順番を守り、有効にしたあともサイトと SSH が生きていることを確かめます。

ヒント

  • 1. ufw default deny incoming と ufw default allow outgoing で既定を決める
  • 2. ufw allow 22/tcp を先に打つ
  • 3. ufw allow 80/tcp を打つ
  • 4. ufw enable で有効にする
  • 5. ufw status verbose > /root/ufw-status.txt に保存し、サイトと SSH が生きていることを確かめる

8 項目で採点します