Claude Code 専用ユーザーの制限設定

アフィリエイト広告を利用しています

このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です

前回の記事で SSH の強化とファイアウォールの設定を行いました。この記事では、Claude Code 専用ユーザーに対してディスク・リソース・コマンドの制限を設定していきます。

ネットワークの制限は UFW で済んでいるので、ここでは「ユーザーが OS 上でできること」を絞り込みます。万が一 Claude Code が暴走しても、被害がそのユーザーの範囲内に収まるようにするのが目的です。

順番が前後しますが、この記事で行った設定変更が正しく反映されているか確認するコマンドをまとめておきます。詳細については本文をご覧ください。

# ディスククォータ
sudo quota -u cc-sample-order

# プロセス数制限(ulimit)
sudo su - cc-sample-order -c "ulimit -u"

# メモリ制限(cgroups)
systemctl show user-1001.slice | grep -E "MemoryMax|MemoryHigh"

# 設定ファイルのロック(chattr)
sudo lsattr /home/cc-sample-order/.bashrc /home/cc-sample-order/.profile /home/cc-sample-order/.bash_logout

# コマンド制限
sudo su - cc-sample-order -c "ssh localhost" 2>&1 | head -1

ディスククォータの設定

Claude Code がディスクを使い切ってしまうと、OS 全体に影響が出ます。専用ユーザーごとにディスク使用量の上限を設定しておきます。

クォータの有効化

まず、ファイルシステムでクォータを有効にする必要があります。/etc/fstab のルートパーティションに usrquota オプションを追加します。

sudo cp /etc/fstab /etc/fstab.bak
sudo vi /etc/fstab

ルートパーティションの行で defaultsdefaults,usrquota に変更します。

# 変更前
/dev/disk/by-id/... / ext4 defaults 0 1

# 変更後
/dev/disk/by-id/... / ext4 defaults,usrquota 0 1

再起動なしで反映し、クォータを有効化します。quota パッケージがインストールされていない場合は先にインストールしてください。

# quota パッケージのインストール(未インストールの場合)
sudo apt install quota -y

# 再マウント
sudo mount -o remount /

# クォータファイルの作成と有効化
sudo quotacheck -cum /
sudo quotaon /

クォータの設定

専用ユーザーにディスク使用量の上限を設定します。

sudo setquota -u cc-sample-order 20G 22G 0 0 /

ソフトリミット 20GB、ハードリミット 22GB です。ソフトリミットを超えると警告が出て、ハードリミットを超えると書き込みが拒否されます。2GB の余裕は、ソフトリミット到達後に状況を確認する猶予です。

設定を確認します。

sudo quota -u cc-sample-order
Disk quotas for user cc-sample-order (uid 1001):
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/ubuntu--vg-ubuntu--lv
                     20  20971520 23068672               5       0       0

quota(ソフトリミット)と limit(ハードリミット)に値が入っていれば設定完了です。

リソース制限(ulimit / cgroups)

ディスクの次は、プロセス数とメモリに上限を設けます。Claude Code が無限ループに入ったり、大量のプロセスを生成したりした場合のセーフティネットです。

ulimit によるプロセス数制限

専用ユーザー向けの制限ファイルを作成します。

sudo vi /etc/security/limits.d/cc-sample-order.conf
cc-sample-order  soft  nproc  100
cc-sample-order  hard  nproc  150

ソフトリミット 100、ハードリミット 150 です。通常の Claude Code の作業でプロセスが 100 を超えることはまずありません。万が一フォーク爆弾のような状態になっても 150 で止まります。

確認します。

sudo su - cc-sample-order -c "ulimit -u"
100

cgroups によるメモリ制限

systemd のユーザースライスを使って、メモリ使用量に上限をかけます。専用ユーザーの UID を確認してからスライスの設定を作成します。

# UID の確認
id cc-sample-order
# → uid=1001

# スライスの設定ディレクトリを作成
sudo mkdir -p /etc/systemd/system/user-1001.slice.d
sudo vi /etc/systemd/system/user-1001.slice.d/memory.conf
[Slice]
MemoryMax=4G
MemoryHigh=3G

MemoryHigh(3GB)を超えるとメモリ回収が強化され、MemoryMax(4GB)を超えるとプロセスが強制終了されます。

sudo systemctl daemon-reload

確認します。

systemctl show user-1001.slice | grep -E "MemoryMax|MemoryHigh"
MemoryHigh=3221225472
MemoryMax=4294967296
StartupMemoryHigh=infinity
StartupMemoryMax=infinity

MemoryHigh=3221225472(3GB)、MemoryMax=4294967296(4GB)になっていれば OK です。Startup の値が infinity なのは起動時の制限で、通常時には影響しません。

設定ファイルの変更禁止(chattr)

Claude Code は bash で動作するため、.bashrc.profile を書き換えることで制限を回避できる可能性があります。これらのファイルを chattr +i(immutable)で変更不可にしておきます。

sudo chattr +i /home/cc-sample-order/.bashrc
sudo chattr +i /home/cc-sample-order/.profile
sudo chattr +i /home/cc-sample-order/.bash_logout

+i フラグが設定されたファイルは、root であっても chattr -i で解除しない限り変更・削除できません。

sudo lsattr /home/cc-sample-order/.bashrc /home/cc-sample-order/.profile /home/cc-sample-order/.bash_logout
----i---------e------ /home/cc-sample-order/.bashrc
----i---------e------ /home/cc-sample-order/.profile
----i---------e------ /home/cc-sample-order/.bash_logout

i フラグが表示されていれば設定完了です。

コマンド実行の制限

ネットワーク系のコマンドのうち、Claude Code に使わせたくないものの実行権限を外します。この Ubuntu は Claude Code 専用機なので、管理ユーザー以外がこれらのコマンドを使うことはありません。

sudo chmod o-x /usr/bin/wget
sudo chmod o-x /usr/bin/nc
sudo chmod o-x /usr/bin/ssh
sudo chmod o-x /usr/bin/scp
sudo chmod o-x /usr/bin/sftp

chmod o-x は「その他のユーザー」から実行権限を外す設定です。管理ユーザー(所有者またはグループ)には影響しません。

専用ユーザーから実行できないことを確認します。

sudo su - cc-sample-order -c "ssh localhost" 2>&1 | head -1
-bash: line 1: /usr/bin/ssh: Permission denied

ブラウザについても確認しておきます。Server 版では通常インストールされていませんが、念のため。

snap list 2>/dev/null | grep -i firefox
dpkg -l | grep -i firefox
dpkg -l | grep -i chromium

何も表示されなければ、ブラウザはインストールされていません。

現在の状態まとめ

ここまでで、専用ユーザーに対する制限設定が完了しました。

制限項目設定内容
ディスククォータソフト 20GB / ハード 22GB
プロセス数ソフト 100 / ハード 150
メモリMemoryHigh 3GB / MemoryMax 4GB
設定ファイル.bashrc / .profile / .bash_logout を変更不可(chattr +i)
コマンド制限wget / nc / ssh / scp / sftp の実行を禁止
curl制限しない(UFW で通信先を制御)
ブラウザ未インストール(Server 版)

ここまでの作業で、隔離環境の土台が整いました。次の工程では、いよいよ Claude Code のインストールと初期設定に進みます。