VMware隔離生活の勧め

VMware隔離生活の勧め

◇ debianのセキュリティ向上

いよいよここからが本題です。まず、Linux環境でのブラウジングだけでも、ほとんどのWindows向けexploitは不活性化しましたが、不十分です。世の中には「VMescape」という、仮想環境からの脱獄狙いがいます。もっとも私の環境だと、脱獄した先で生き残る可能性は低いのですが、事故予防のために最初にコピー・アンド・ペースト機能を無効にします。これは「Win」→「debian」の通路を防ぐためです。さらにはVMware Toolsも無効化しておきます。これでby-passの危険性を少し抑えました。続いてVMware上のdebianのFireFoxを不活性化するというわけのわからないことをします。

firejailという仕組みがあります。概説を省くと、つまりfirejail経由で実行したソフトは、専用のポリシーに従い、DNS接続も何もかも指定された経路を強制され、さらに設定次第ではロクに書き込みも読み込みもできない状態にすることができます。それを目指します。

まずはfirejailをインストールします。apt-get install firejailで容易に入ってくるはずです。ついでに官公庁向けFireFoxの「firefox esr」もapt-getでインストールしておきます。さらにはappamor(debian向けのカーネルレベルでのセキュリティモジュール)も入れます。これだけではまだ不足しています。まずはfirefox向けのプロファイルを設定します。

sudo vi /etc/firefox/firefox.local
#firefox.local

# ---- 1. 基本セキュリティ ----
nonewprivs
nogroups
noroot
no3d
protocol unix,inet,inet6
netfilter

# ---- 2. Firefoxプロファイル保存のため、privateを使わない ----
# private を外すことで ~/.mozilla が見える
# private-tmp などは維持可能

private-tmp
private-dev
private-etc machine-id

# ---- 3. 必要ディレクトリの明示的許可 ----
noblacklist ${HOME}/.mozilla
whitelist ${HOME}/.mozilla
noblacklist ${HOME}/.cache/mozilla
whitelist ${HOME}/.cache/mozilla

# ---- 4. D-Bus制限 ----
dbus-user filter
dbus-user.own org.mozilla.*
dbus-user.own org.mpris.MediaPlayer2.firefox.*
ignore dbus-user none

# ---- 5. リソース・システム制限 ----
disable-mnt
nodvd
caps.drop all
seccomp

# ---- 6. DNS制限 ----
dns 1.1.1.1

# ---- 7. 書き込み制限・危険ファイルのブロック ----
noexec ${HOME}
noexec /tmp
blacklist ${HOME}/デスクトップ
blacklist ${HOME}/ダウンロード
blacklist ${HOME}/ドキュメント
blacklist ${HOME}/ピクチャ
blacklist ${HOME}/ビデオ
blacklist ${HOME}/ミュージック
blacklist ${HOME}/テンプレート

blacklist /srv
blacklist /media
blacklist /mnt
blacklist /root
blacklist /usr/local
blacklist /usr/libexec
blacklist /var/log
blacklist /var/crash
blacklist /etc/ssh
blacklist /etc/sudoers
blacklist /usr/bin/libreoffice
blacklist /usr/lib/libreoffice

これでほとんどのシステム側ディレクトリへのアクセスが塞がれましたが、まだ足りませんね。apparmorを設定します。

sudo vi /etc/apparmor.d/firejail-firefox

/usr/bin/firefox-esr {
  # 基本許可
  #include <abstractions/base>
  # 明示的な書き込み許可(例:.mozillaのみ)
  owner @{HOME}/.mozilla/** rwk,
  owner @{HOME}/.cache/mozilla/** rwk,

  # ネットワーク制限(必要なら)
  deny network,
  deny /etc/ssh/** r,
  deny /root/** rw,
}

これでもまだ不足しています。ついでにDNS漏れも防ぎます。徹底しましょう。通常のネットワークマネージャー使ってる環境であればこれで逆引きも漏れなくなります。

vi /etc/resolv.conf

# Generated by NetworkManager
#search localdomain
#nameserver 192.168.45.2

search localdomain
#nameserver 192.168.45.2
nameserver 1.1.1.1
nameserver 8.8.8.8
nameserver 2606:4700:4700::1111  # Cloudflare IPv6
nameserver 2001:4860:4860::8888 # Google IPv6

ネットワークマネージャーで生成されている場合、上書きされることがあるのでchattr +i /etc/resolv.confしておけば上書きされなくなります。ただしトラブル発生時の解決が面倒になるため、天秤にかけてください。正直firefoxでもDNSを明示するのでオーバーキル感はありますが、「debian」→ネットワーク時の身元漏れを防ぐならやっておくべき項目にはなります。

そしてcgroupでいたずらすら禁止します。自分のidを叩きます。私の場合だと、id=1000でした。

1000のIDを対象にcgroupを設定します。まずはメモリ制限・タスク制限・CPU制限の3種が有効になるように/etc/systemd/system.confに追記します。

DefaultTasksAccounting=yes
DefaultMemoryAccounting=yes
DefaultCPUAccounting=yes

ついでなので、カーネルレベルでスタック強制なども設定します。

sudo vi /etc/sysctl.d/10-limits.conf

kernel.randomize_va_space = 2
fs.suid_dumpable = 0
# IPソースルート無効化(外部からの経路指定攻撃防止)
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
# パケットリダイレクト無効(ルーティングの改ざんを防止)
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
# ICMP経由のルート広告も拒否
net.ipv6.conf.all.accept_ra = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
kernel.yama.ptrace_scope = 1
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1

本丸のcgroupを設定します。

sudo mkdir /etc/systemd/system/user-1000.slice.d/
vi /etc/systemd/system/user-1000.slice.d/limits.conf
[Slice]
CPUQuota=80%
MemoryMax=1345M
TasksMax=800

ついでにuser-0.slice.dを作り、limits.confを同様に置くと、rootユーザーにも同様の制限が適用されてベストです。

これで再起動すると、カーネルレベルの制限が有効になり、かつid=1000のユーザーは最大で800プロセス、CPUは最大80%、メモリは1GBちょいしか使えなくなりました。別にこれが必須かというと微妙ですが、変なイタズラマルウェアすら霧散させるための保険になります。

さて、ここまで設定した内容をもとに、firefoxをfirejail経由で立ち上げるラッパーを作ります。

mkdir ~/bin/
vim ~/bin/firefox-wrapper.sh

#!/bin/bash

exec firejail \
  --noroot \
  --nogroups \
  --caps.drop=all \
  --seccomp \
  --apparmor=/etc/apparmor.d/firejail-firefox \
  --nonewprivs \
  --private-dev \
  --private-etc=firefox,ssl,ca-certificates \
  --private-tmp \
  --whitelist=${HOME}/.mozilla \
  --whitelist=${HOME}/.cache/mozilla \
  --hostname=fj-browser \
  /usr/bin/firefox-esr "$@"

これでfirefox(esr)は、firejailのプロファイルに従いつつ、さらにapparmorのプロファイルを厳守し、ほとんどのホームディレクトリに書き込めない状況で立ち上がるようになります。

まだまだ不安がありますね。万が一それでもexploitが/homeや/tmpに落ちてきたら?それを防ぐために/etc/fstabを編集します(誤ると立ち上がらなくなるのでスナップショットを撮っておいてください)。

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# systemd generates mount units based on this file, see systemd.mount(5).
# Please run 'systemctl daemon-reload' after making changes here.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda1 during installation
UUID={ID名} /               ext4    errors=remount-ro 0       1
# /home was on /dev/sda8 during installation
UUID={ID名} /home           ext4    defaults,usrquota,noexec,nosuid,nodev        0       2
# /tmp was on /dev/sda7 during installation
UUID={ID名} /tmp            ext4    defaults,noexec,nosuid,nodev       0       2
# /var was on /dev/sda5 during installation
UUID={ID名} /var            ext4    defaults        0       2
# swap was on /dev/sda6 during installation
UUID={ID名} none            swap    sw              0       0
/dev/sr0        /media/cdrom0   udf,iso9660 user,noauto     0       0

この場合、/homeディレクトリと/tmpディレクトリのマウントオプションに「noexec」と「nosuid」ビットをつけています。つまり/homeと/tmpでは実行ファイルを./execすることができません。これで再起動をかけたら、試しに先程のwrapperを./bin/firefox-wrapperしてみます。エラーになれば/homeと/tmp以下では何も実行できなくなっています。ブラウジングのために、sh /home/{ユーザーID}/bin/firefox-wrapperして立ち上げます。

無事に立ち上がりました。この状態であれば一般的な攻撃者の手にあるようなツールや技術では突破が困難な「多層防御の極致」に近い状態ですが、それでもなんだかムズムズしますね。はい、広告サーバーすら読みたくありません。私の場合はublockとUser Agent Switcher and Managerを入れてみました。完全にホスト情報まで、UserAgentレベルでWindowsに偽装します。つまり万が一にも水飲み場を踏んだとか、汚染された広告配信サーバーを踏んだーーとしても、Windows10向けマルウェアを投げる→無反応を狙います。

FireFoxの場合は簡単すぎるので説明は簡単に書きます。「Firefox ublock」と「Firefox User Agent Switcher and Manager」で検索すれば出てきます。強いていうなら後者は、Chrome+Windows10とか、攻撃すら嫌だったらWindows11+Chromeあたりに設定しておけば良いでしょう。つまり攻撃側からは「Windows10向けにexploit投げてみたけど何も起こらん・・・」という状況を狙います。

◇ 終わりにーーここまでして得られるものは?

得られるものを問われると・・・手間の割には安全性が入手できます。それだけです。万が一にもこれでVMwareのdebianが汚染されたとしても、スナップショットでワンクリック出元に戻せます。完璧な砂場が出来上がりました。とはいえ、台風レベルの0dayが出てくれば話は別ですが。この状態だと「Win」→「debian」のファイル転送は皆無です(むしろセキュリティが崩れるのでやってはいけません)ので、もし画像ファイルを共有したいとか、PDFを共有したいという場合はGoogleドライブなどをうまく使ってください。ローカル側はこれでほぼ無傷で動かすことができます。マルウェアは泣きます。rootkitはキレます。一応、YouTube1ウインドウぐらいなら行ける程度の最小限度を極めた構成なので、必要に応じて緩和してください。

コメントを投稿する

メールアドレスは公開されませんのでご安心ください。 * が付いている欄は必須項目となります。

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。

ページの先頭