月: 2018年11月

  • Debian 9 Stretch で ufw による簡単ファイアウォール設定

    Debian 9 Stretch で ufw による簡単ファイアウォール設定

    Linux 環境でファイアウォールを構築するお話です。

    Linux にはカーネルレベルでパケットフィルタや NAT を行う netfilter という仕組みがあり、それを設定するのが iptables です。iptables をそのまま扱えれば一番良いのですが、柔軟さ故に学習コストは高めです。そのため、firewalld や ufw といった iptables のフロントエンドが存在しています。今回は ufw を使います。

    ufw は Uncomplicated Firewall の略で、Python で書かれた iptables のフロントエンドです。

    以下、インストールと簡単な使い方です。

    インストールと有効化

    $ sudo apt install ufw
    $ sudo ufw enable
    Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
    Firewall is active and enabled on system startup
    $ sudo ufw status
    Status: active

    SSH で作業しましたが、有効化しても切断されることはありませんでした。絶対に切断されないとは言い切れないので、念のため切断されたら八方塞りになる状況では止めておきましょう。

    全てを deny して SSH のみ allow する

    $ sudo ufw default deny
    Default incoming policy changed to 'deny'
    (be sure to update your rules accordingly)
    $ sudo ufw allow ssh
    Rule updated
    Rule updated (v6)
    atmark@dev:~$ sudo ufw status
    Status: active
    
    To Action From
    -- ------ ----
    22/tcp ALLOW Anywhere 
    22/tcp (v6) ALLOW Anywhere (v6)

    たったこれだけです。default を deny して、ssh を allow するだけ。簡単ですね。

    アプリケーション単位で allow/deny する

    ufw app list で有効なアプリケーションの一覧が表示されます。

    $ sudo ufw app list
    Available applications:
     AIM
     Bonjour
     CIFS
     DNS
     Deluge
     Dovecot IMAP
     Dovecot Secure IMAP
     IMAP
     IMAPS
     IPP
     KTorrent
     Kerberos Admin
     Kerberos Full
     Kerberos KDC
     Kerberos Password
     LDAP
     LDAPS
     LPD
     MSN
     MSN SSL
     Mail submission
     NFS
     OpenSSH
     POP3
     POP3S
     PeopleNearby
     Postfix
     Postfix SMTPS
     Postfix Submission
     SMTP
     SSH
     Socks
     Telnet
     Transmission
     Transparent Proxy
     VNC
     WWW
     WWW Cache
     WWW Full
     WWW Secure
     XMPP
     Yahoo
     qBittorrent
     svnserve

    この名前をつかって deny/allow するだけです。

    $ sudo ufw allow SSH
    $ sudo ufw allow "WWW Full"
    $ sudo ufw status
    Status: active
    
    To Action From
    -- ------ ----
    SSH LIMIT Anywhere 
    WWW Full ALLOW Anywhere 
    SSH (v6) LIMIT Anywhere (v6) 
    WWW Full (v6) ALLOW Anywhere (v6)

    ルールの削除

    2 通りあります。まずは追加したルールをそのまま削除するやり方。

    $ sudo ufw delete allow SSH

    もう一つは現在のルール一覧を番号付けして、その番号で削除するやり方。

    $ sudo ufw status numbered
    Status: active
    
    To Action From
    -- ------ ----
    [1] SSH LIMIT Anywhere 
    [2] WWW Full ALLOW Anywhere 
    [3] SSH (v6) LIMIT Anywhere (v6) 
    [4] WWW Full (v6) ALLOW Anywhere (v6) 
    
    $ sudo ufw delete 4
    Deleting:
     allow 'WWW Full'
    Proceed with operation (y|n)?

    名前で指定するか、ポート番号で指定するか

    ちょっとややこしかったので、軽くまとめておきます。

    app list で表示される内容は /etc/ufw/applicatoin.d/ 以下に用意されています。例えば WWW 関係は次のようになっています。

    $ cat /etc/ufw/application.d/ufw-webserver 
    [WWW]
    title=Web Server
    description=Web server
    ports=80/tcp
    
    [WWW Secure]
    title=Web Server (HTTPS)
    description=Web Server (HTTPS)
    ports=443/tcp
    
    [WWW Full]
    title=Web Server (HTTP,HTTPS)
    description=Web Server (HTTP,HTTPS)
    ports=80,443/tcp
    
    [WWW Cache]
    title=Web Server (8080)
    description=Web Server (8080)
    ports=8080/tcp

    ルールを追加するときのポートの指定は 3 通りあって

    • ポート番号の直接指定 – 443/tcp
    • プロトコル名 – https
    • アプリケーション名 – WWW Secure

    このうち、ポート番号の直接指定もプロトコル名も、ルールに登録されるのは数字のポート番号そのものです。allow https としても 443/tcp でルールに登録されます。

    アプリケーション名で指定すると、指定した名前そのままで登録されます。

    ここでややこしいのが、例えばアプリケーション名とプロトコル名が同じ SSH の場合。allow SSH と書くと名前で登録されますが、allow ssh とすると 22/tcp で登録されます。

    接続制限 limit

    $ sudo ufw limit ssh

    もう一つ、limit というルールがあります。man には次のよう書かれています。

    ......
    ufw will normally allow the connection
    but will deny connections if an IP address attempts
    to initiate 6 or more connections within 30 seconds
    ......

    30 秒間に 6 回以上接続を試みた場合に接続を拒否するルールです。SSH などは総当りでログイン試行が来るので、limit をかけておいた方が良いでしょう。

    参考