Ubuntu での “ほぼ完全防御” MongoDB + OS + AppArmor 構成
■ 1-1. bash 設定ファイルを不変化(chattr)
まず bash 設定を強制した上で不変化します。
# bash 設定を固定する
cat << 'EOF' >> ~/.bashrc
export HISTSIZE=200000
export HISTFILESIZE=200000
export HISTCONTROL=ignoredups
shopt -s histappend
EOF
# bash 設定を Immutable に
sudo chattr +i ~/.bashrc
sudo chattr +i ~/.profile
sudo chattr +i /etc/profile
sudo chattr +i /etc/bash.bashrc
■ 1-2. bash 以外のシェルを封印
内部犯行の入口「sh/dash/zsh/fish」の使用を禁止。
sudo chmod 000 /bin/sh /bin/dash /bin/zsh /bin/fish
※ Ubuntu はデフォルト /bin/sh → dash
→ これはシステムの一部が使用する可能性があるので最終的に AppArmor で守るのが安全。
(後述します)
■ 1-3. /tmp からの実行を禁止(noexec)
偽 mongo や python スクリプトなどの “隠し実行” を封じる。
sudo mount -o remount,noexec /tmp
sudo mount -o remount,noexec /var/tmp
永続化する場合(/etc/fstab に追記):
/tmp tmpfs defaults,noexec,nosuid 0 0
■ 1-4. SSH の port forwarding を禁止
sudo nano /etc/ssh/sshd_config
追加:
AllowTcpForwarding no
PermitTunnel no
PermitOpen none
反映:
sudo systemctl restart sshd
■ 1-5. mongo クライアント本体を不変化(改ざん防止)
sudo chattr +i /usr/bin/mongo
sudo chattr +i /usr/bin/mongosh
■ 2-1. bindIp を localhost のみにする
/etc/mongod.conf
net:
bindIp: 127.0.0.1
■ 2-2. DB ユーザーは “アプリ専用の 1ユーザーのみ”
例:
db.createUser({
user: "appuser",
pwd: "xxxxx",
roles: [ { role: "readWrite", db: "appdb" } ]
});
■ 2-3. systemLog だけは強化
systemLog:
destination: file
path: "/var/log/mongodb/mongod.log"
verbosity: 2
3-1: “/usr/bin/mongo 以外の mongo(偽装バイナリ含む)を全部禁止”
次のファイルを作成:
sudo nano /etc/apparmor.d/usr.bin.mongo
内容:
# allow only the real mongo binary
/usr/bin/mongo {
# 実行を許可
/usr/bin/mongo rix,
# 必要な読み込み
/etc/mongod.conf r,
# ライブラリ読み込み許可
/usr/lib/** rm,
/lib/** rm,
# /tmp の実行禁止
deny /tmp/** mrwix,
# 他ディレクトリの mongo 実行禁止(コピー対策)
deny /**/mongo* x,
# ネットワーク(MongoDB localhost のみ許可)
network inet stream,
capability net_bind_service,
}
有効化:
sudo apparmor_parser -r /etc/apparmor.d/usr.bin.mongo
3-2:python / node / ruby など DB 接続可能な言語を封印
例:python3
sudo nano /etc/apparmor.d/usr.bin.python3
/usr/bin/python3 {
# 全てのネットワークアクセス拒否
deny network inet stream,
deny /usr/bin/mongo x,
}
node も同様:
sudo nano /etc/apparmor.d/usr.bin.node
/usr/bin/node {
deny network inet stream,
}
3-3:アプリケーションだけは DB に接続できるようにしたい
(例:Node.js アプリ /var/www/app/server)
sudo nano /etc/apparmor.d/var.www.app.server
/var/www/app/server {
# ネットワーク接続を許可(←アプリのみ)
network inet stream,
# 他のプログラム実行制限
deny /usr/bin/python3 x,
deny /usr/bin/mongo x,
deny /bin/sh x,
# アプリ読み書き許可
/var/www/app/** rw,
}
有効化:
sudo apparmor_parser -r /etc/apparmor.d/var.www.app.server
4. 最終的に内部犯行者ができること・できないこと
| 行動 | 状態 | 理由 |
|---|---|---|
| bash history 改ざん | ❌ 不可 | chattr |
| HISTFILE=/dev/null | ❌ 不可 | bashrc immutable |
| sh/dash/zsh/fish 起動 | ❌ 不可 | chmod & AppArmor |
| mongo 偽装バイナリ実行 | ❌ 不可 | AppArmor |
| python/node で DB 操作 | ❌ 不可 | AppArmor |
| SSH port forwarding | ❌ 不可 | sshd_config |
| systemd 経由の実行 | ❌ 設定次第で不可 | AppArmor |
| root 権限取得 | △ 可能 | OSの限界 |
| kernel exploit | △ 理論上可能 | ただし稀 & 難度高 |
ここまで来ると、
内部犯行による “意図的な DB 改ざん・持ち出し” は事実上不可能 です。
登録日:
更新日:
by
プログラマーこまつ