Chmod計算ツール
Linux/Unixのファイル権限のインタラクティブ計算機。
chmod 000 filename
一般的な権限
使い方
- 所有者、グループ、その他に対する読み取り、書き込み、実行の権限を設定するためにチェックします。
- または、3桁の数値(例: 755)を直接入力します。
- シンボリック表記と
chmodコマンドがリアルタイムで更新されます。 - コマンドをコピーをクリックして、完全なchmodコマンドをコピーします。
権限リファレンス
| 番号 | 権限 | シンボル |
|---|---|---|
| 0 | 権限なし | --- |
| 1 | 実行のみ | --x |
| 2 | 書き込みのみ | -w- |
| 3 | 書き込み + 実行 | -wx |
| 4 | 読み取りのみ | r-- |
| 5 | 読み取り + 実行 | r-x |
| 6 | 読み取り + 書き込み | rw- |
| 7 | 読み取り + 書き込み + 実行 | rwx |
よくある質問
chmod 755は何を意味しますか?
755は、所有者が読み取り、書き込み、実行(7)できる一方で、グループとその他は読み取りと実行はできるが書き込みはできない(5)ことを意味します。これはディレクトリとスクリプトの最も一般的な権限です。
644と755の違いは?
644(rw-r--r--)は所有者に読み取り/書き込みを許可し、他のすべての人には読み取りのみを許可します · ファイルの典型です。755(rwxr-xr-x)は実行権限を追加します · ディレクトリとスクリプトの典型です。
ディレクトリにも機能しますか?
はい。数値権限は同じように機能します。ディレクトリの場合、「実行」はディレクトリに入ってその内容にアクセスできることを意味します。
Unixパーミッションモデル:9ビット
Unix系システムのすべてのファイルとディレクトリは、誰が何をできるかを記録する小さな整数である「モード」を持っている。このモデルはSixth Edition Unix(1975年5月)からほぼ変わっておらず、最初のchmodマニュアルエントリはVersion 1 Unix(1971年11月)に登場した。読み取り/書き込み/実行の3ビット3組(合計9ビット)として配置されており、各組はファイルの所有者・グループ・その他全員に対応する:
Owner Group Others
r w x r w x r w x
4 2 1 4 2 1 4 2 1
各3ビットグループは厳密に8進数1桁だ。3ビットは2³ = 8種類の値(0〜7)をエンコードするからで、ウェイト4・2・1はそれぞれ2²・2¹・2⁰だ。読み取り(4)+書き込み(2)+実行(1)の任意の組み合わせを加算すると、衝突なしに8つの可能なクラス桁が得られる。これが8進数〜シンボリックのマッピング全体だ。chmod 755はつまり、所有者に対してrwx(4+2+1=7)、グループに対してr-x(4+1=5)、その他全員に対してr-xを意味する。
ls -lで表示される10文字の文字列は同じデータにファイルタイプを示す先頭の1列が追加されたものだ:通常ファイルが-、ディレクトリがd、シンボリックリンクがl、キャラクターデバイスがc、ブロックデバイスがb、名前付きパイプがp、ソケットがs。残りの9文字がパーミッショントリプルだ。
シンボリック記法:chmod u+x file
8進数モードは9ビット全部を一度に上書きする。シンボリックモードは非破壊的で、指定したビットのみを変更する。文法は対象 + 操作 + 許可:
- 対象:
u所有者(ユーザー)、gグループ、oその他、aすべて(= ugo)。 - 操作:
+追加、-削除、=設定(他をクリア)。 - 許可:
r・w・x、プラス特殊文字:X(対象がディレクトリ、または少なくとも1つのクラスで実行可能な場合のみ実行を追加)、s(setuid/setgid)、t(スティッキー/制限削除)。別クラスからコピーも可能:u・g・o(例:g=uはグループのパーミッションを所有者と同一に設定)。
実用的な例:
chmod u+x script.sh:所有者のみに実行権限を追加。chmod g-w shared.log:グループの書き込みを削除。chmod a=rw note.txt:全員を読み取り/書き込みに設定し、全員の実行をクリア。chmod o= secret.key:「その他」のすべてのビットをクリア。chmod -R u+rwX,go+rX /var/www:所有者にフルアクセス、その他に読み取りを再帰的に付与。大文字のXはディレクトリか、いずれかのクラスで実行権限を持つファイルにのみ実行を追加するため、すべてのテキストファイルを誤って実行可能にせずに済む。
数値モードは明示的で冪等だ(chmod 755は常に同じ9ビットを意味する)。シンボリックモードは外科的だ(chmod g+wは1ビットのみを変更する)。本番スクリプトは監査ログの明瞭さのために数値を好む傾向があり、シェルで入力するオペレーターはインクリメンタルな調整にシンボリックを好む傾向がある。
一般的なモードとその用途
| モード | シンボリック | 典型的な用途 |
|---|---|---|
| 755 | rwxr-xr-x | 公開実行ファイルと標準ディレクトリ(/usr/bin/*、Webドキュメントルート、Gitワーキングツリー) |
| 644 | rw-r--r-- | 標準的な通常ファイル、設定、ソースコード、ドキュメント |
| 700 | rwx------ | プライベートディレクトリ(~/.ssh、他者に見せるべきでない個人ドキュメント) |
| 600 | rw------- | プライベートファイル(~/.ssh/id_rsa・~/.gnupg/*、パスワードファイル) |
| 444 | r--r--r-- | 誰でも読み取り専用、固定の参照データ、Cargoレジストリインデックス |
| 750 | rwxr-x--- | 所有者フル、グループ読み取り/トラバース、他者なし、グループ共有サービスディレクトリ |
| 777 | rwxrwxrwx | ほぼ常に誤りだ。後述。 |
chmod 777がほぼ常に誤りな理由
ファイルを777に設定すると、誰でも読み取り・書き込み・実行が可能になる。マシン上の任意のユーザー(非特権サービスアカウントや侵害されたプロセスも含む)がファイルの内容を読み取り・修正・実行できる。「とりあえず動くまでchmod 777する」というチュートリアルのアドバイスは、数え切れないほどの実際の侵害の原因となったセキュリティアンチパターンだ:改ざんされた誰でも書き込み可能な設定ファイル、改ざんベクターになる誰でも書き込み可能なWebディレクトリ、ログ偽造を可能にする誰でも書き込み可能なログファイル、任意のコード実行を可能にする誰でも書き込み可能なディレクトリ。
パーミッションエラーが発生している場合、ほぼ常に正しい修正は、アクセスが必要なユーザーが実際にファイルを所有または共同所有するように、ファイルの所有者を(chownで)またはグループを(chgrpで)変更することだ。全員のアクセス制御を削除することではない。
特殊ビット:setuid・setgid・スティッキー
モードの先頭に付加された4番目の8進数桁が3つの特殊ビットを解放する。すべてオリジナルのUnix設計の遺物だ:
- 4xxx、setuid(set user ID)。実行可能ファイルに設定すると、プログラムは実行者の権限ではなく所有者の権限で実行される。典型的な例は
passwdだ:すべてのユーザーが実行できるが、setuid-rootだからこそ/etc/shadowに書き込める。Setuidは主要なセキュリティ対象で、現代のLinuxはより粒度の細かい権限ビットを持つファイルケイパビリティ(setcap経由)への置き換えを進めており、多くのディストロがsetuidビットを段階的に削除している。 - 2xxx、setgid(set group ID)。実行可能ファイルでは、ファイルのグループで実行される。ディレクトリでは、内部で作成されたファイルが作成者のプライマリグループではなくディレクトリのグループを継承する。共有プロジェクトディレクトリに便利だ。
- 1xxx、スティッキービット。ディレクトリでは、ファイルの所有者(またはroot)のみが、ディレクトリ自体の書き込みパーミッションに関わらず内部のファイルを削除・リネームできる。典型的な用途は
/tmpだ:誰でもファイルを作れるように誰でも書き込み可能だが、スティッキービットがユーザー同士のファイル削除を防ぐ。
ls -lの表示は、これらのビットが設定されている場合に実行文字をs・S・t・Tに置き換える(大文字はビットが設定されているが基礎の実行ビットが設定されていないことを意味する)。
umask:chmodの逆
chmodは既存のファイルのパーミッションを設定する。umaskは減算マスクとして機能することで、作成するファイルのデフォルトパーミッションを決定する。計算:新しい通常ファイルは666(rw-rw-rw-)、新しいディレクトリは777から始まり、umaskで設定された部分が引かれる。一般的な値:
- umask 022(ほとんどのLinuxディストロのデフォルト):グループとその他から書き込みを削除する。新しいファイルは644、新しいディレクトリは755になる。
- umask 002(一部の共有開発環境のデフォルト):その他からのみ書き込みを削除する。新しいファイルは664、ディレクトリは775になる。開発チームが互いのファイルを読み書きしたい場合に便利だ。
- umask 077(プライベートサーバーやセキュリティ意識の高い設定で一般的):グループとその他からすべてのパーミッションを削除する。新しいファイルは600、ディレクトリは700になる。
引数なしでumaskを実行すると現在の値が表示される。シェルの初期化ファイル(~/.bashrc・~/.zshrc)または/etc/login.defsに設定するとセッション全体に適用される。
ファイルとディレクトリ:xの異なる意味
同じr/w/xビットでも、ファイルとディレクトリでは微妙に異なる意味を持つ:
- ディレクトリへの読み取り:内容を一覧表示する。読み取りがなくても、実行権限があれば既知のファイル名にアクセスできるが、
lsは機能しない。 - ディレクトリへの書き込み:内部のエントリを作成・削除・リネームする。注意:これはファイル自体の書き込みパーミッションとは無関係だ。ディレクトリへの書き込みにスティッキービット(1xxx)を加えることで、
/tmpのような制御されたマルチユーザー共有ディレクトリが可能になる。 - ディレクトリへの実行:トラバース(
cdで入る、内部の名前付きエントリにアクセスする)。実行権限のないディレクトリは事実上行き止まりだ。多くの微妙な「パーミッション拒否」の問題はこの区別から来ている:深いディレクトリへの読み取りはあるが親ディレクトリの一つへの実行がないため、到達できない。
再帰的chmodとfindパターン
chmod -R 755 /var/wwwはツリー内のすべてのファイルとディレクトリに同じモードを適用するが、ファイルとディレクトリは異なるモードが必要なためほぼ常に誤りだ(例:ファイルに644、ディレクトリに755)。正しい慣用句はfindを使う:
find /var/www -type f -exec chmod 644 {} +
find /var/www -type d -exec chmod 755 {} +
または同等に、GNUのchmodの大文字Xを使う:chmod -R u=rwX,go=rX /var/wwwはディレクトリと既にどこかに実行権限があるファイルにのみ実行を付与する。通常欲しい結果そのものだ。
シンボリックリンク・ACL・Linuxがモデルを拡張する方法
知っておく価値のある2つの改良:
- シンボリックリンクは独自のモード(常に777)を持つが無視される。
chmodはデフォルトでリンクを辿って対象を修正する。リンク自体を操作するにはBSDでchmod -h、GNUでchmod --no-dereferenceを使う。ただし実際にそうする理由はほとんどない。 - POSIX ACL(
setfacl・getfacl)は基本モデルをユーザーごと・グループごとのエントリで拡張する。ファイルは標準モードビットに触れずに特定ユーザーへの書き込みを付与できる。ls -lはACLを持つファイルの末尾に+を表示する。macOS・ほとんどのLinuxファイルシステム・BSDすべてがサポートしているが、オプションであり多くのシステム管理者はシンプルなクラシックモードを好む。 - Windows NTFS ACLはさらに豊富で、ユーザーごと・グループごとのエントリに明示的な許可/拒否ビットと継承可能な継承がある。
chmodモデルは直接変換されない。CygwinとWSLはNTFSの上で不完全にエミュレートする。
さらなる質問
SSHキーが「パーミッションが開きすぎている」と拒否されるのはなぜか?
OpenSSHクライアントは、グループまたは他者が読み取れる秘密鍵の使用を拒否する。他者が読めるものはクレデンシャルであるべきではないという前提だ。修正方法はchmod 600 ~/.ssh/id_rsa(およびディレクトリ自体にchmod 700 ~/.ssh)だ。~/.gnupg/や他のほとんどのクレデンシャルストアも同じロジックが適用される。
chmodとchownの違いは何か?
chmodはモードビット(所有者/グループ/その他ができること)を変更する。chownは誰が所有者かを変更する。多くの場合、両方が必要だ:「別のユーザーが読めない」ファイルは通常パーミッションを開く必要がなく、アクセスが必要なユーザーが所有する必要がある。まずchown myuser:mygroup fileを試すこと。
ログファイルに666を使うべきか?
ほぼ不要だ。誰でも書き込み可能なログファイルは、任意のプロセス(低権限ユーザーとして実行されている侵害されたサービスを含む)がログエントリを偽造したりログを消去したりできるようにする。標準的なパターンは、ログディレクトリを特定のロググループ(Debianではadm、BSDではwheelなど)が書き込めるようにして関連するサービスをそのグループに追加するか、ファイルの所有権を処理するlogrotate + ロギングデーモン(rsyslog・systemd-journald)を使用することだ。
このツールは特殊ビットを考慮するか?
いいえ。基本9ビット(標準3桁モード)を対象としている。setuid(4xxx)・setgid(2xxx)・スティッキー(1xxx)の場合は先頭の桁を手動で付加する。日常的なchmod作業の大半は3桁モードを使用し、特殊ビットに触れることはない。
サーバーに何か送信されるか?
いいえ。トグル↔8進数↔シンボリック換算は純粋な演算でブラウザーで計算される。ページは一度読み込まれればオフラインでも動作する。