ufwファイアウォール
通す番号を、こちらから決める
ここまでで、入口の扉は締めました。次は、そもそもどの番号への接続を受け付けるかを決めます。これがファイアウォールの仕事です。
考え方は権限最小と同じです。全部を開けておいて危ないものを塞ぐのではなく、全部を閉じておいて必要なものだけ開ける。前者は塞ぎ忘れがそのまま穴になりますが、後者は開け忘れても不便になるだけで、危険にはなりません。
Debian で使うのは ufw です。名前は uncomplicated firewall の略で、その名のとおり、細かい仕組みを覆い隠して数行で書けるようにした道具です。
まず既定を決める
ufw default deny incoming
ufw default allow outgoing入ってくる接続は既定で拒む、出ていく接続は既定で許す、という宣言です。サーバーが自分から取りに行く通信、たとえば apt でのパッケージ取得は出ていく側なので、こちらは許しておきます。
開ける番号を足す
ufw allow 22/tcp
ufw allow 80/tcp22 は SSH、80 は HTTP です。番号のうしろの /tcp は、そのプロトコルに限る指定です。付けなくても動きますが、付けたほうが意図がはっきりします。
順番を間違えると自分が締め出される
ここが今回のいちばんの勘どころです。有効にする前に、必ず 22 番を先に許可します。
ufw allow 22/tcp # 先にこれ
ufw enable # そのあとでこれ逆にすると、既定の deny が効いた瞬間に自分の SSH 接続も拒まれます。手元の VM ならやり直せますが、遠くにあるサーバーでは物理的に触れない限り復旧できません。実際によくある事故です。
ufw enable を打つと、いま繋がっている接続が切れるかもしれない、という警告が出て確認を求められます。あの警告はこの事故を指しています。
いまの状態を読む
ufw status verboseStatus: active
Default: deny (incoming), allow (outgoing), disabled (routed)
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhereverbose を付けると既定の方針まで出ます。付けないと規則の一覧だけになるので、「既定が deny になっているか」を確かめたいときは必ず付けてください。
Anywhere は、どこからの接続でも許す、という意味です。接続元を絞りたいときは、こう書けます。
ufw allow from 203.0.113.10 to any port 22決まった場所からしか運用しないなら、SSH はこの形にしておくと守りが一段強くなります。
規則を消す
ufw status numbered
ufw delete 2番号を振って表示させ、その番号で消します。消すと番号が振り直されるので、複数消すときは大きい番号から消してください。小さいほうから消すと、あとの番号がずれて別の規則を消します。
手を動かす
既定を拒否に切り替え、SSH と HTTP だけを通す状態にします。順番を守り、有効にしたあともサイトと SSH が生きていることを確かめます。