Armadillo: 不要なTCP/UDPポートを閉じる方法

本ブログでは、Armadillo-400,800シリーズ,Armadilo-IoT G2にて不要なTCP/UDPポート(以下ポートと記載)を閉じる方法についてご紹介します。

Armadillo-400,800シリーズ,Armadilo-IoT G2のカーネルは開発を円滑に行えるようにするため、デフォルトで「TCP/80:http,TCP/21:ftp,TCP/23:telnet」が開放されています。
量産時にftpやtelnetのTCPポートを開放させたままにしておくとセキュリティが弱くなってしまうため、使用しない場合はポートを閉じておくことが大切です。
開放されたポートの確認方法については、別ブログ「Armadillo: ポート開放状態の確認方法」を参照してください。

今回は例として、Armadillo-440にて初期設定から不要ポートを閉じる方法について記載します。

ポート初期開放設定の変更準備

初期設定から不要ポートを閉じるには、Linuxカーネル/ユーザランドをビルドする際に設定の変更を行う必要があります。
設定はATDE5を用いて行うため、Armadillo-440の「ドキュメント・ダウンロード」よりダウンロードします。
ATDE5を起動させた後、ATDE5上にLinuxカーネル/ユーザランドのソースファイルをダウンロードします。
ダウンロードしたLinuxカーネル/ユーザランドをそれぞれ解凍します。

atde5:~$ tar zxf atmark-dist-[version].tar.gz
atde5:~$ tar zxf linux-3.14-at[version].tar.gz
atde5:~$ ls
atmark-dist-[version]         linux-3.14-at[version]
atmark-dist-[version].tar.gz  linux-3.14-at[version].tar.gz

ATDE5でビルドできるArmadilloユーザランドのソースファイルは、次のように各製品の情報を保存してあります。
この中に「Armadillo-440」ディレクトリが存在することを確認しておきます。

atde5:~$ cd atmark-dist-[version]/vendors/AtmarkTechno
atde5:~/atmark-dist-[version]/vendors/AtmarkTechno$ ls
Armadillo-210.Base        Armadillo-440          Armadillo-IoTG-Std
Armadillo-210.Common      Armadillo-460          Armadillo-IoTG.Common
Armadillo-210.Recover     Armadillo-4x0.Common   Armadillo-WLAN.Common
Armadillo-220.Base        Armadillo-500          Common
Armadillo-220.Recover     Armadillo-500-FX.base  SUZAKU-V.Common
Armadillo-230.Base        Armadillo-500-FX.dev   SUZAKU-V.SZ310
Armadillo-230.Recover     Armadillo-810          SUZAKU-V.SZ310-SID
Armadillo-240.Base        Armadillo-840          SUZAKU-V.SZ310-SIL
Armadillo-240.Recover     Armadillo-840m         SUZAKU-V.SZ310-SIL-GPIO
Armadillo-2x0.Common      Armadillo-8x0.Common   SUZAKU-V.SZ410
Armadillo-300             Armadillo-9            SUZAKU-V.SZ410-SID
Armadillo-420             Armadillo-9.Common     SUZAKU-V.SZ410-SIL
Armadillo-420.WLAN-AWL12  Armadillo-9.PCMCIA     SUZAKU-V.SZ410-SIL-GPIO
Armadillo-420.WLAN-AWL13  Armadillo-Box-WS1      SUZAKU-V.SZ410-SIV

この「Armadillo-440」ディレクトリの中身を変更することで、「Armadillo-440」の初期設定を変更します。

ユーザランドの設定変更によるポートの閉鎖

今回は「ポートの開閉を管理するfirewall」の設定スクリプトファイルを変更する方法で不要なポートを閉じます。
firewallの設定ファイル編集はroot権限が必要なため、[sudo]を用いて編集します。

atde5:~/atmark-dist-[version]/vendors/AtmarkTechno$ cd Armadillo-440/
atde5:~/atmark-dist-[version]/vendors/AtmarkTechno/Armadillo-440$ sudo vi etc/init.d/firewall

設定スクリプトファイルは次のように[iptables]コマンドで任意のポートを開放しています。
これを変更することで、Armadillo起動時に開放されるポートを制限することができます。

-------略--------
# allow all non-external interfaces for everything
iptables -A INPUT  ! -i $EXT -j ACCEPT
iptables -A OUTPUT ! -o $EXT -j ACCEPT
 
# external interface
 
  icmp incoming
  iptables -A INPUT -i $EXT -p icmp -j ACCEPT
 
  # tcp incoming
  if [ "$ALLOW_HTTP" = "yes" ]; then
    iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport http     -j ACCEPT
  fi
  if [ "$ALLOW_TELNET" = "yes" ]; then
    iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport telnet   -j ACCEPT
  fi
  if [ "$ALLOW_FTP" = "yes" ]; then
    iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport ftp      -j ACCEPT
  fi
  if [ "$ALLOW_SNMP" = "yes" ]; then
    iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport snmp     -j ACCEPT
  fi
  if [ "$ALLOW_SSH" = "yes" ]; then
    iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport ssh      -j ACCEPT
  fi
  if [ "$ALLOW_SERI2ETH" = "yes" ]; then
    iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport 21347    -j ACCEPT
  fi
 
  iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport ftp-data   -j ACCEPT
  iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport auth       -j REJECT
  iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport 6000:6010  -j DROP
  iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport 1024:65535 -j ACCEPT
-------略--------

[iptables]コマンドの「ACCEPT」部分を、書式に合わせて書き換えることでポートの変更を行うことができます。
今回は例としてftpとtelnetのTCPポートを「REJECT」に変更します。

-------略--------
# allow all non-external interfaces for everything
iptables -A INPUT  ! -i $EXT -j ACCEPT
iptables -A OUTPUT ! -o $EXT -j ACCEPT
 
# external interface
 
  icmp incoming
  iptables -A INPUT -i $EXT -p icmp -j ACCEPT
 
  # tcp incoming
  if [ "$ALLOW_HTTP" = "yes" ]; then
    iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport http     -j ACCEPT
  fi
  if [ "$ALLOW_TELNET" = "yes" ]; then
    iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport telnet   -j REJECT
  fi
  if [ "$ALLOW_FTP" = "yes" ]; then
    iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport ftp      -j REJECT
  fi
  if [ "$ALLOW_SNMP" = "yes" ]; then
    iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport snmp     -j ACCEPT
  fi
  if [ "$ALLOW_SSH" = "yes" ]; then
    iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport ssh      -j ACCEPT
  fi
  if [ "$ALLOW_SERI2ETH" = "yes" ]; then
    iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport 21347    -j ACCEPT
  fi
 
  iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport ftp-data   -j ACCEPT
  iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport auth       -j REJECT
  iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport 6000:6010  -j DROP
  iptables -A INPUT -i $EXT -p tcp -d 0/0 --dport 1024:65535 -j ACCEPT
-------略--------

設定スクリプトファイル修正後、「Linuxカーネル/ユーザーランドをビルドする」「tftpdl を使用してフラッシュメモリを書き換える」を参考にLinuxカーネル/ユーザランドを書き換えます。
書き換え後、ATDE5より[nmap]コマンドを実行し、[TCP/80:http]ポートのみ開放されていることが確認できれば完了です。

atde5:~$ nmap [Armadillo-440のIPアドレス]
 
Starting Nmap 6.00 ( http://nmap.org ) at 2018-01-05 17:05 JST
Nmap scan report for [Armadillo-440のIPアドレス]
Host is up (0.0029s latency).
Not shown: 843 closed ports, 156 filtered ports
PORT   STATE SERVICE
80/tcp open  http
製品: 
Armadillo-IoT G1/G2
Armadillo-840
Armadillo-440