0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

第3回:アクセス制御の神髄 —— chmod/chown vs NTFSアクセス許可(ACL)

0
Posted at

はじめに

Linuxエンジニアにとって、ファイルの権限管理といえば ls -l で見る rwxr-xr-x です。「所有者・グループ・その他」の3区分に対して「読み・書き・実行」を割り振るだけで、非常に直感的です。

しかし、WindowsのNTFS(New Technology File System)は 「誰が、何に対して、どんな詳細な操作ができるか」をリスト形式で管理します。この「リスト形式」こそが、Linuxエンジニアを混乱させる ACL(Access Control List)の正体です。


1. 「3つの数字」vs「リスト形式」

Linuxは固定の3枠(User / Group / Other)ですが、Windowsは 「ACE(Access Control Entry)」 というエントリを束ねた 「ACL(Access Control List)」 というリストで管理します。

比較項目 Linux(基本権限) Windows(NTFS)
管理単位 所有者 / グループ / その他(固定3枠) ユーザー/グループを任意の数だけ追加可能
権限の種類 r, w, x(3種) 読取、書込、変更、フルコントロール等(10種以上)
拒否の概念 明示的な拒否なし(権限を与えない=拒否) 「拒否(Deny)」という明示的な設定がある
継承の概念 基本的にない(umask のみ) 上位フォルダの設定が下位に自動で伝播する

ACL のイメージ

Linux の権限が「1枚のチケット(3枠固定)」だとすると、Windows の ACL は 「入場者リスト(名刺の束)」 です。

【Linux: /data ディレクトリの権限】
rwxr-x---  owner=alice  group=devs

【Windows: C:\Data の ACL(概念図)】
┌──────────────────────────────────────────┐
│ ACE 1: SYSTEM           → フルコントロール │
│ ACE 2: Administrators   → フルコントロール │
│ ACE 3: devs グループ    → 変更(M)        │
│ ACE 4: alice            → フルコントロール │
│ ACE 5: mallory(拒否)  → 読み取り拒否     │
└──────────────────────────────────────────┘

2. Windowsの特異点①:継承(Inheritance)

Linuxエンジニアが最もハマるのが 「継承」 です。

  • Linux: /dir の権限を変えても、その下の /dir/file の権限は -R オプションを付けない限り変わりません。
  • Windows: 親フォルダに「devs グループ:変更許可」を与えると、その下に作成されるすべてのファイル・サブフォルダに 自動的にその権限が継承(コピー) されます。
C:\Projects\                ← ここに devs:変更(M) を設定
│
├── frontend\               ← 自動的に devs:変更(M) を継承
│   └── index.html          ← 自動的に devs:変更(M) を継承
│
└── backend\                ← 自動的に devs:変更(M) を継承
    └── app.py              ← 自動的に devs:変更(M) を継承

継承の無効化

「このフォルダだけ親の設定を引き継ぎたくない」という場合、継承の無効化(Disable Inheritance) を行います。継承を無効化せずに権限を個別変更しようとしても「親から継承されているため変更できません」とブロックされます。

# PowerShell で継承を無効化し、現在の権限をコピーとして保持する
$acl = Get-Acl "C:\Projects\secret"
$acl.SetAccessRuleProtection($true, $true)   # 第1引数: 継承を無効化, 第2引数: 既存ACEを保持
Set-Acl "C:\Projects\secret" $acl

icacls を使う場合は以下のとおりです。

:: 継承を無効化し、既存の権限をそのまま保持する
icacls C:\Projects\secret /inheritance:d

3. Windowsの特異点②:「許可」と「拒否」の優先順位

Linuxには「明示的な拒否」という概念はありません。しかしWindowsには 「拒否(Deny)」 という設定があり、複数の ACE が存在するときに厳密な優先順位で評価されます。

優先度(高) ─────────────────────────── 優先度(低)
  明示的な拒否 > 明示的な許可 > 継承された拒否 > 継承された許可

具体例で理解する

シナリオ:
  - alice は devs グループのメンバー
  - devs グループ: 読み取り「許可」
  - alice 個人:    読み取り「拒否」(明示的)

結果: alice はアクセス「拒否」
→ 明示的な拒否がグループの許可より優先される

運用上の注意:
「特定のユーザーだけアクセスさせない」目的で「拒否」を使いたくなりますが、継承と組み合わさると予期しない挙動を招きやすく、障害調査が困難になります。基本は「許可を与えない」ことで制御するのがWindows運用の鉄則です。「拒否」はどうしても必要な場合の最終手段と位置づけましょう。


4. 実践:コマンドで権限を確認・操作する

権限の確認

Linux の ls -l に相当するのが PowerShell の Get-Acl と、コマンドプロンプトの icacls です。

# ACL を一覧表示する(ls -l 相当)
Get-Acl C:\SharedData | Format-List

# ACE を1行ずつ見やすく表示する
(Get-Acl C:\SharedData).Access | Select-Object IdentityReference, FileSystemRights, AccessControlType, IsInherited

出力例:

IdentityReference   FileSystemRights  AccessControlType  IsInherited
-----------------   ----------------  -----------------  -----------
BUILTIN\Administrators  FullControl   Allow              True
DOMAIN\devs             Modify        Allow              True
DOMAIN\alice            Read          Deny               False

IsInheritedTrue のものが親から継承された ACE です。

権限の変更

# devs グループに「変更(Modify)」権限を付与する(chmod g+w 相当)
$acl = Get-Acl "C:\Data"
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    "DOMAIN\devs", "Modify", "ContainerInherit,ObjectInherit", "None", "Allow"
)
$acl.AddAccessRule($rule)
Set-Acl "C:\Data" $acl

icacls でも同様の操作が可能です。

:: devs グループに変更権限を付与(サブフォルダ・ファイルにも継承)
icacls C:\Data /grant "DOMAIN\devs:(OI)(CI)M"

:: OI = ObjectInherit(ファイルに継承)
:: CI = ContainerInherit(サブフォルダに継承)
:: M  = Modify(変更)

Linux の chmod との対応表

Linux Windows(icacls) 意味
r R 読み取り
rw M(Modify) 読み取り+書き込み(削除・名前変更も含む)
rwx F(FullControl) すべての操作
chmod +x 直接対応なし(実行可能ファイルはOS拡張子で判断) 実行権限

覚えておくべき制限:
Linux の 755644 を NTFS に完璧に翻訳することはできません。Windows には「属性の読み取り」「拡張属性の書き込み」などOS独自の細かい権限(特殊なアクセス許可)が存在するためです。まずは 「読み取り(R)」「変更(M)」「フルコントロール(F)」 の3つを押さえることから始めましょう。


まとめ

観点 Linux Windows(NTFS)
権限の構造 固定3枠(UGO) × 3ビット ACL(ACE の積み重ね)
対象の柔軟性 グループは1つのみ ユーザー・グループを任意の数だけ設定可能
継承 なし(-R で手動再帰) あり(親→子へ自動伝播)
拒否の優先 なし(権限なし=拒否) 明示的な拒否が最強
確認コマンド ls -l Get-Aclicacls
変更コマンド chmodchown Set-Aclicacls /grant

WindowsのNTFSアクセス許可は、Linuxエンジニアから見ると「過剰に複雑」に映るかもしれません。しかしこの細かさがあるからこそ、数万人規模の組織で「この部署のこの役職の人だけ、このファイルの上書きを禁止する」といった緻密な制御が実現できています。「継承」と「拒否の優先順位」 の2点を押さえれば、Windowsのファイルサーバー管理は格段に理解しやすくなります。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?