vyatta6.4をセキュアなsqueezeとして使う

■vyatta6.4、Core版でWebGUIが無くても、充分面白い。

 vmplayerにvyattaを導入する
 http://d.hatena.ne.jp/labunix/20120707

■gatewayの追加

$ configure
# set system gateway-address 192.168.213.1
# commit
# save
# exit

$ ip addr show eth0 | sed s/" "/"\n"/g | grep -A 1 "inet\$"
inet
192.168.213.213/24

$ /sbin/route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.213.2   0.0.0.0         UG    0      0        0 eth0
loopback        *               255.0.0.0       U     0      0        0 lo
192.168.213.0   *               255.255.255.0   U     0      0        0 eth0

■sshサービスの有効化

$ configure
# set service ssh listen-address 192.168.213.213
# set service ssh  port 22
# set service ssh  protocol-version v2
# commit
# save
# exit

$ grep "Port\|Protocol\|Listen" /etc/ssh/sshd_config | grep -v "^#"
Port 22
ListenAddress 192.168.213.213
Protocol 2

□□□英語キーボード配列のままなので、ここからはsshで□□□

■DNS設定

$ configure
# set system name-server 192.168.213.2
# commit
# save
# exit
$ nslookup google.co.jp 192.168.213.2
Server:    192.168.213.2
Address 1: 192.168.213.2

Name:      google.co.jp
Address 1: 173.194.38.120 nrt19s18-in-f24.1e100.net
Address 2: 173.194.38.119 nrt19s18-in-f23.1e100.net
Address 3: 173.194.38.127 nrt19s18-in-f31.1e100.net
[edit]

$ sudo cat /etc/resolv.conf
nameserver      192.168.213.2

■vyatta4peopleリポジトリを設定する

 参考:Add Vyatta4People.Org package repository:
 http://www.vyatta4people.org/repo/

$ configure
# set system package repository vyatta4people url http://packages.vyatta4people.org/debian
# set system package repository vyatta4people distribution experimental
# set system package repository vyatta4people components main
# commit
# save
# exit

■Squeezeのリポジトリを追加する

$ configure
# set system package repository squeeze distribution squeeze
# set system package repository squeeze components main
# set system package repository squeeze url http://ftp.de.debian.org/debian
# commit
# save
# exit

■プロキシ(クライアント)の設定
 ※vmnet8のホストが下位squidプロキシサーバ

$ sudo cat /etc/profile.d/proxy.sh
#!/bin/bash
export http_proxy=http://192.168.213.1:3128/
export ftp_proxy=http://192.168.213.1:3128/
export HTTP_PROXY=http://192.168.213.1:3128/
export FTP_PROXY=http://192.168.213.1:3128/

$ sudo cat /etc/apt/apt.conf
APT::Periodic::Update-Package-Lists 1;
Acquire::http::Proxy "http://192.168.213.1:3128/";

■apt-getを使う
 ※パッケージのあるリポジトリが設定澄みである点に注意。
  手元のSqueezeよりもkernelバージョンが新しいのは、vyatta用なので。。。

$ sudo cat /etc/apt/sources.list
deb http://packages.vyatta.com/vyatta stable main # community #
deb http://packages.vyatta4people.org/debian experimental main # vyatta4people #
deb http://ftp.de.debian.org/debian squeeze main # squeeze #

$ sudo apt-get update
$ sudo apt-get install -y vim w3m nmap chkconfig
$ sudo apt-get upgrade
$ uname -a
Linux vyatta 3.0.23-1-586-vyatta #1 SMP Fri Mar 23 19:00:31 PDT 2012 i686 GNU/Linux
$ sudo shutdown -r now && exit

■ブラウジング(日本語対応)
 ※「locales」で日本語に変更したはずだが、「LC_ALL」が変わらなかった。
  手動で変更し、正常に日本語が表示出来た。

$ sudo dpkg-reconfigure locales

 Locales to be generated: 261

 Default locale for the system environment: 2


$ grep -v "^\#\|^\$" /etc/locale.gen
ja_JP.UTF-8 UTF-8

※変更前

$ cat /etc/default/locale
LANG=ja_JP.UTF-8
LC_ALL=C

※変更後

$ cat /etc/default/locale
LANG=ja_JP.UTF-8
LC_ALL=ja_JP.UTF-8

■システムの環境変数が「LC_ALL=C」でも以下の方法で日本語が扱えるので、
 優先度が高い設定であれば、他の方法でも良い。

※w3mのconfigで設定しただけでは上書きされて戻ってしまう。

$ grep UTF-8 .w3m/config
system_charset UTF-8
document_charset UTF-8
display_charset UTF-8

※コマンドラインのオプションで直接上書きの指定をする。

$ w3m -o system_charset="UTF-8" -o display_charset="UTF-8" http://google.co.jp
$ env LC_ALL="ja_JP.UTF-8" w3m http://google.co.jp

■起動サービスの調整
 ※vyatta専用パッケージもあるので、不要なサービスでも停止のみ行う。
  よって、パッケージの削除は行わない。
  ext4(RAID無し)なので、mdadmは不要。電源管理は仮想マシンなので不要。
  chkconfigはリポジトリを読み込んで、インストールが必要。

$ /sbin/runlevel
N 2

$ /sbin/chkconfig --list | grep "2\:on"
acpid                     0:off  1:off  2:on   3:on   4:on   5:on   6:off
atd                       0:off  1:off  2:on   3:on   4:on   5:on   6:off
bootlogs                  0:off  1:on   2:on   3:on   4:on   5:on   6:off
cpufrequtils              0:off  1:off  2:on   3:on   4:on   5:on   6:off
cron                      0:off  1:off  2:on   3:on   4:on   5:on   6:off
lldpd                     0:off  1:off  2:on   3:on   4:on   5:on   6:off
loadcpufreq               0:off  1:off  2:on   3:on   4:on   5:on   6:off
mdadm                     0:off  1:off  2:on   3:on   4:on   5:on   6:off
netplug                   0:off  1:off  2:on   3:on   4:on   5:on   6:off
rc.local                  0:off  1:off  2:on   3:on   4:on   5:on   6:off
rmnologin                 0:off  1:off  2:on   3:on   4:on   5:on   6:off
rsync                     0:off  1:off  2:on   3:on   4:on   5:on   6:off
rsyslog                   0:off  1:off  2:on   3:on   4:on   5:on   6:off
stop-bootlogd             0:off  1:off  2:on   3:on   4:on   5:on   6:off
sudo                      0:off  1:off  2:on   3:on   4:on   5:on   6:off
vyatta-pppoe              0:off  1:on   2:on   3:on   4:off  5:off  6:off
vyatta-quagga             0:off  1:off  2:on   3:on   4:on   5:on   6:off
vyatta-router             0:off  1:off  2:on   3:on   4:on   5:on   6:off

$ sudo fdisk -l /dev/sda | tail -1
/dev/sda1   *           1        1045     8388576   83  Linux
$ cat /etc/fstab | awk '{printf $3","}';echo
FSTAB,ext4,

$ sudo /etc/init.d/acpid stop && sudo chkconfig acpid off
$ sudo /etc/init.d/mdadm-raid stop && sudo /etc/init.d/mdadm stop && sudo chkconfig mdadm off

$ pstree | sed s/"\`"/"+"/
init-+-atd
     |-bgpd
     |-cron
     |-7*[getty]
     |-netplugd
     |-ntpd
     |-ospf6d
     |-ospfd
     |-ripd
     |-ripngd
     |-rsyslogd---2*[{rsyslogd}]
     |-sshd---sshd---sshd---vbash-+-pstree
     |                            +-sed
     |-udevd---2*[udevd]
     +-zebra

■管理者ユーザを追加する
 ※そのまま「PASSWORD」などと設定しないように。
  また、ユーザの「labunix」は読み替えて下さい。

$ configure
# set system login user labunix
# set system login user labunix authentication plaintext-password PASSWORD
# set system login user labunix level admin
# commit
# save
# exit

$ grep labunix /etc/[pg]*[dp] | sed s/"\,toor"//g
/etc/group:adm:x:4:www-data,vyatta,labunix
/etc/group:disk:x:6:vyatta,labunix
/etc/group:sudo:x:27:www-data,vyatta,labunix
/etc/group:dip:x:30:vyatta,labunix
/etc/group:quaggavty:x:103:www-data,vyatta,labunix
/etc/group:vyattacfg:x:105:www-data,vyatta,labunix
/etc/passwd:labunix:x:1001:100::/home/labunix:/bin/vbash

$ id labunix
uid=1001(labunix) gid=100(users) groups=100(users),4(adm),6(disk),27(sudo),30(dip),103(quaggavty),105(vyattacfg)

$ sudo passwd root
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

■ホスト名、ドメイン名の変更
 ※ドメインはldapやDNSのドメイン名のことのようです。

$ configure
# set system host-name vmvyatta
# set system domain-name localdomain
# commit
# save
# exit

$ hostname -i
127.0.1.1
$ hostname -I
192.168.213.213
$ hostname -f
vmvyatta

$ cat /etc/resolv.conf
nameserver      192.168.213.2
domain          localdomain             #line generated by /opt/vyatta/sbin/vyatta_update_resolv.pl

■設定の保存(loadでリストア出来る)

$ configure
# save backup_config_20120713
Saving configuration to '/config/backup_config_20120713'...
Done
# set system config-management commit-revisions 21
# save
Saving configuration to '/config/config.boot'...
Done
# exit

$ tail -1 /config/backup_config_20120713
/* Release version: VC6.4-2012.05.31 */

■vyatta6.4のバージョン詳細

$ /opt/vyatta/bin/vyatta-show-version | grep -v "^HW\|ID"
Version:      VC6.4-2012.05.31
Description:  Vyatta Core 6.4 2012.05.31
Copyright:    2006-2012 Vyatta, Inc.
Built by:     autobuild@vyatta.com
Built on:     Thu May 31 06:32:55 UTC 2012
System type:  Intel 32bit
Boot via:     disk
Hypervisor:   VMware
Uptime:       14:41:36 up  1:32,  2 users,  load average: 0.05, 0.17, 0.12

$ cat /etc/debian_version
6.0.5

■脆弱性チェック1
 sshポートはフィルタされているとはいえ、見えてしまう。

 DMZ内の実験サーバ(Squeeze)の初期設定
 http://d.hatena.ne.jp/labunix/20120618/

$ sudo nmap -sT 192.168.213.213 | grep ^[0-9]
22/tcp open  ssh
$ sudo nmap -sU 192.168.213.213 | grep ^[0-9]
123/udp open|filtered ntp

■NATでsshを隠蔽する。

# set interfaces ethernet eth1 address 172.16.213.213/24
# set service ssh listen-address 172.16.213.213
# set nat destination rule 10
# set nat destination rule 10 destination address 192.168.213.213
# set nat destination rule 10 destination port 22
# set nat destination rule 10 protocol tcp
# set nat destination rule 10 translation address 172.16.213.213
# set nat destination rule 10 inbound-interface eth0
# delete service ssh listen-address 192.168.213.213
# commit
# save
# exit

※ログインし直す。(隠蔽された)

$ show nat destination translations
Pre-NAT              Post-NAT             Prot  Timeout
192.168.213.213      172.16.213.213       tcp   299

$ sudo nmap -sT 192.168.213.213 | grep ^[0-9]
$ sudo nmap -sT 172.16.213.213 | grep ^[0-9]
22/tcp open  ssh

■脆弱性チェック2
 すべてのTCPポートが閉じていると判定し、UDP/123を検出していない。
 OSも不明な状況。「172.16.213.213」は外側からはルーティングを知らないので、到達すら出来ない。
 「192.168.213.213」について外部からアクセスするには、vmnet8なので、ルーティングとマスカレードの両方の設定が必要。

$ sudo ./penetration.sh 192.168.213.213
Starting Nmap 5.00 ( http://nmap.org ) at 2012-07-13 15:24 GMT
NSE: Loaded 30 scripts for scanning.
Initiating Parallel DNS resolution of 1 host. at 15:24
Completed Parallel DNS resolution of 1 host. at 15:24, 0.04s elapsed
Initiating SYN Stealth Scan at 15:24
Scanning 192.168.213.213 [65535 ports]
Completed SYN Stealth Scan at 15:24, 16.62s elapsed (65535 total ports)
Initiating Service scan at 15:24
Initiating OS detection (try #1) against 192.168.213.213
Retrying OS detection (try #2) against 192.168.213.213
NSE: Script scanning 192.168.213.213.
NSE: Script Scanning completed.
Host 192.168.213.213 is up (0.00028s latency).
All 65535 scanned ports on 192.168.213.213 are closed
Too many fingerprints match this host to give specific OS details
Network Distance: 0 hops

Read data files from: /usr/share/nmap
OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 19.99 seconds
           Raw packets sent: 65547 (2.885MB) | Rcvd: 131092 (5.508MB)

■ntpサービスをvmnet8側の参照先のntpサーバ以外からはアクセス出来ないようにする
 ※LAN内からはアクセスするので、見えるのは仕方無いが、
  「192.168.213.213」のリッスンを止めればこれも見えなくなる。

$ netstat -an | grep 123 | grep "^udp "
udp        0      0 172.16.213.213:123      0.0.0.0:*
udp        0      0 192.168.213.213:123     0.0.0.0:*
udp        0      0 127.0.0.1:123           0.0.0.0:*
udp        0      0 0.0.0.0:123             0.0.0.0:*

$ configure
# delete system ntp server 0.vyatta.pool.ntp.org
# delete system ntp server 1.vyatta.pool.ntp.org
# delete system ntp server 2.vyatta.pool.ntp.org
# set system ntp server 192.168.188.188
# set firewall name NTP-FILETR
# set firewall name NTP-FILETR rule 1
# set firewall name NTP-FILETR rule 1 destination address !192.168.188.188/32
# set firewall name NTP-FILETR rule 1 destination port 123
# set firewall name NTP-FILETR rule 1 source address !192.168.188.188/32
# set firewall name NTP-FILETR rule 1 source port 123
# set firewall name NTP-FILETR rule 1 protocol udp
# set firewall name NTP-FILETR rule 1 action drop
# set interfaces ethernet eth0 firewall in name NTP-FILETR
# set interfaces ethernet eth0 firewall out name NTP-FILETR
# commit
# save
# exit

$ configure
# set nat destination rule 11
# set nat destination rule 10 destination address 192.168.213.213
# set nat destination rule 11 destination port 123
# set nat destination rule 11 protocol udp
# set nat destination rule 11 translation address 172.16.213.213
# set nat destination rule 11 inbound-interface eth0
# commit
# save
# exit

■ntpサーバの正常性確認

$ sudo ntpq -p -n
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*192.168.188.188    133.243.238.164  2 u  154  512  377    1.993    2.116   0.304

$ sudo ntptime | grep returns
ntp_gettime() returns code 0 (OK)
ntp_adjtime() returns code 0 (OK)

$ sudo ntpq -c rv | sed s/"\,\| "/"\n"/g | grep -v "^\$\|\"" | grep "=" | column
associd=0                       clock=d3aac0eb.95d3f936
status=0615                     peer=21126
leap=00                         tc=9
stratum=3                       mintc=3
precision=-18                   offset=2.116
rootdelay=14.185                frequency=-25.098
rootdisp=68.266                 sys_jitter=0.306
refid=192.168.188.188           clk_jitter=6.463
reftime=d3aabaa5.22d8cb73       clk_wander=0.875

$ sudo ntpdate -d 192.168.188.188 | grep [a-z] | grep -v "("
server 192.168.188.188, port 123
stratum 2, precision -23, leap 00, trust 000
refid [192.168.188.188], delay 0.02716, dispersion 0.00006
transmitted 4, in filter 4
reference time:    d3aabf1d.14b76be4  Fri, Jul 13 2012 15:37:01.080
originate timestamp: d3aac35b.86fcf055  Fri, Jul 13 2012 15:55:07.527
transmit timestamp:  d3aac35b.862f2803  Fri, Jul 13 2012 15:55:07.524
filter delay:  0.02776  0.02716  0.02756  0.02724
filter offset: 0.002485 0.002023 0.001976 0.002060
delay 0.02716, dispersion 0.00006
offset 0.002023
13 Jul 15:55:09 ntpdate[13099]: adjust time server 192.168.188.188 offset 0.002023 sec

■オープン/フィルタ。ちょっと惜しいが、個人利用としては充分セキュアだと思う。

$ sudo nmap -sU 192.168.213.213 | grep ^[0-9]
123/udp open|filtered ntp