🏠 ホーム
プログラミング
インフラ
フリーランスCTO
DB
完全無料ツールまとめ
マーケティング
教育

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

コメント         tweetでコメント