Claude Code 専用ユーザーの作成と権限設計

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

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

Claude Code 専用ユーザーを作成し、プロジェクト間でファイルが見えないように分離する作業の記録です。「設計と方針」で決めた「プロジェクトごとにユーザーを分離する」を、実際に Ubuntu 上で設定していきます。

この記事の作業が終わると、専用ユーザーの作成、ホームディレクトリの保護、プロジェクト間の分離確認まで完了した状態になります。

ユーザー設計の方針

Claude Code はターミナルで動作するツールで、起動したユーザーの OS 権限でファイルを読み書きします。つまり、そのユーザーがアクセスできるファイルは、Claude Code からもすべてアクセスできます。

たとえば A社と B社の案件コードが同じユーザーのホームディレクトリにあった場合、Claude Code は両方のコードを読めてしまいます。CLAUDE.md に「対象ディレクトリ以外は見ないでください」と書いても、それはアプリ層の自主規制であり、OS が強制するものではありません。これはシリーズ1本目の記事で説明した「allow / deny は自主規制」と同じ問題です。

そこで、プロジェクトごとに専用の Linux ユーザーを作成し、OS レベルで分離する方針にしています。各ユーザーは自分のホームディレクトリにしかアクセスできず、他のプロジェクトのファイルには一切触れられません。

命名規則

ユーザー名は cc-企業名-案件名 の形にしています。cc- は Claude Code 用ユーザーであることを示すプレフィックスです。管理ユーザーとの区別がひと目でつきます。

Linux のユーザー名は小文字・数字・ハイフンで構成し、32文字以内に収めるのが目安です。長くなりすぎる場合は案件名を省略します。

この記事では、架空のクライアント「株式会社サンプル」の受発注システム案件を例に、cc-sample-order というユーザーを作成していきます。

専用ユーザーの作成

管理ユーザーで SSH 接続している状態から、専用ユーザーを作成します。

sudo useradd -m -s /bin/bash cc-sample-order

-m でホームディレクトリを自動作成し、-s /bin/bash でログインシェルを bash に設定しています。

パスワードは設定しません。このユーザーには SSH で直接ログインさせず、管理ユーザーから sudo su - cc-sample-order で切り替える運用です。パスワードを設定しないことでアカウントはロック状態になり、パスワード認証による不正ログインを防げます。

作成できたことを確認します。

id cc-sample-order
uid=1001(cc-sample-order) gid=1001(cc-sample-order) groups=1001(cc-sample-order)

sudo グループに含まれていないことがポイントです。このユーザーは sudo 権限を持たないため、システム全体に影響する操作はできません。

ホームディレクトリとパーミッション

Ubuntu 24.04 では、ホームディレクトリのデフォルトパーミッションは 750(所有者:読み書き実行、グループ:読み取り実行、その他:アクセス不可)です。同じグループに属するユーザーからは中身が見える可能性があるため、確実にプロジェクト間を分離するために 700 に変更します。

sudo chmod 700 /home/cc-sample-order

設定を確認します。

ls -ld /home/cc-sample-order
drwx------ 2 cc-sample-order cc-sample-order 4096 Mar 15 03:00 /home/cc-sample-order

drwx------ になっていれば、所有者以外はアクセスできない状態です。

アカウントがロック状態であることも確認しておきます。

sudo passwd -S cc-sample-order
cc-sample-order L 2026-03-14 0 99999 7 -1

先頭の L はロック状態を意味します。パスワード認証でのログインはできません。

作業ディレクトリの構成

ホームディレクトリの中に、プロジェクト用のディレクトリを作成します。

sudo -u cc-sample-order mkdir /home/cc-sample-order/project

ディレクトリ構成は以下のようになります。

/home/cc-sample-order/
└── project/            ← Git リポジトリ(Claude Code の起動ディレクトリ)
    ├── .git/
    ├── .gitignore       ← commit-msg.txt を追跡対象外にする
    ├── CLAUDE.md        ← プロジェクトレベルの設定(Git管理)
    ├── commit-msg.txt   ← Claude Code が書き出すコミットメッセージ
    └── (ソースコード)

project/ は Git リポジトリのクローン先です。実運用ではリポジトリ名がそのままディレクトリ名になりますが、project に固定しておくと、どのユーザーでも同じパスで扱えるため運用が楽になります。クローン時に git clone <リポジトリURL> project とすれば、任意のリポジトリ名を project にリネームできます。

commit-msg.txt は、Claude Code にコミットメッセージを書き出してもらうためのファイルです。rsync でメインPCに同期し、VS Code の commit.template でコミットメッセージ欄にプリフィルする仕組みです。リポジトリルート(project/ 直下)に置くことで、git の commit.template を相対パスで指定できます。内容は毎回書き換わるため、.gitignore に追加して Git の追跡対象外にします。詳しくは「開発ワークフローとファイル同期」の記事で説明します。

Claude Code は project/ ディレクトリに cd してから起動します。Claude Code は起動したディレクトリ(カレントディレクトリ)を作業の起点にするため、ここに CLAUDE.md を置いておけば自動的に読み込まれます。

プロジェクト間の分離確認

パーミッション 700 が正しく効いているか、実際に確認しておきます。テスト用に2人目のユーザーを作成して、お互いのホームディレクトリが見えないことを検証します。

# テスト用の2人目を作成
sudo useradd -m -s /bin/bash cc-sample-inventory
sudo chmod 700 /home/cc-sample-inventory

まず、cc-sample-order から cc-sample-inventory のホームディレクトリにアクセスしてみます。

sudo su - cc-sample-order -c "ls /home/cc-sample-inventory"
ls: cannot open directory '/home/cc-sample-inventory': Permission denied

逆方向も確認します。

sudo su - cc-sample-inventory -c "ls /home/cc-sample-order"
ls: cannot open directory '/home/cc-sample-order': Permission denied

どちらも Permission denied になりました。OS レベルでプロジェクト間のファイルが完全に分離されていることが確認できました。

一方、管理ユーザーからは sudo を付ければアクセスできます。rsync でファイルを同期する際に必要なので、こちらも確認しておきます。

sudo ls /home/cc-sample-order/
project

管理ユーザーからは見える、専用ユーザー同士は見えない。これが意図した状態です。

確認が終わったので、テスト用のユーザーを削除しておきます。

sudo userdel -r cc-sample-inventory

現在の状態まとめ

ここまでで、専用ユーザーの作成とプロジェクト分離の基本設定が完了しました。

  • Claude Code 専用ユーザー cc-sample-order を作成済み
  • ホームディレクトリのパーミッションは 700(所有者のみアクセス可)
  • パスワードなし(ロック状態)、SSH 直接ログイン不可
  • sudo 権限なし
  • 作業ディレクトリ project/ を作成済み
  • プロジェクト間のファイル分離を確認済み

次の工程では、SSH の公開鍵認証への切り替えやファイアウォールの精緻化など、セキュリティ面の強化に進みます。