Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

UNIX(Linux)
入門編

  1. UNIX(Linux)とは
  2. ディストリビューションとは
  3. CentOSとMacOSとCUIについて
  4. 仮想化ソフトウェアを使ったCentOSのインストールとMacOSのCUI環境について
  5. ログインとrootユーザーとシャットダウン等について
  6. コマンドの構造と注意点について
  7. ファイルシステムとカレントディレクトリの移動と表示(cdとpwd)について
  8. 各主要ディレクトリの解説とディレクトリ等の内容表示(ls)について
  9. ちょっと高度なディレクトリの移動(cd)とパスについて
  10. 『ls』コマンドの応用(1)とドットファイルについて
  11. 『ls』コマンドの応用(2)
  12. タブキーを使った入力補完について
  13. ディレクトリの作成方法(mkdir)について
  14. ファイルの簡易作成(touch)とファイルについて
  15. 標準入出力とリダイレクション(>と>>)を使ったファイル生成とechoとcatについて
  1. ファイルとディレクトリの削除(rm)について
  2. ファイルとディレクトリのコピー(cp)について
  3. ファイルとディレクトリの移動と名前変更(mv)について
  4. viエディタとは
  5. viの基本的な使い方(1)
  6. viの基本的な使い方(2)
  7. ターミナル(sshとTera Term)を使ったリモート操作について
  8. ソフトウェアのインストール方法(yumとパッケージ管理ツール)について
  9. ユーザーの概要と確認と追加と切り替え(adduserとsu)について
  10. ユーザーのパスワードと削除と更新と管理者権限での実行(passwdとuserdelとusermodとsudo)について
  11. グループの概要と確認方法(groups)について
  12. グループの追加と削除と設定変更(groupaddとgroupdelとgroupmod)とユーザー追加方法について
  13. パーミッション(権限)について
  14. パーミッションの設定方法(chmodとchown)について
  1. トップページ
  2. UNIX(Linux)入門編 - パーミッション(権限)について

パーミッション(権限)について

みなさまこんにちはははでございます。

さて続きまして今回は『パーミッション』(permission)についてやっていきましょう。

「permission」をそのまま略すと「許諾」を表す言葉なのですがPCな世界だと「権限」とか「アクセス権」みたいな少しひろーい意味を持つ感じになりましてマルチユーザーシステムが基本となるUNIX系OSでは必須項目になるとっても重要な概念になりますね。

んでこの権限周りの知識がある程度無いと「『パーミッション』でひっかかってソフトウェアのインストールとか実行とかができない(´・ω・`)」とか「秘密鍵とかが読み込めなくて通信出来ない(:_;)」とかそういう事態になりがちなんですよね。しかも結構ややこしいというかむつかしい部分が多いので気合をいれてがんばっていきましょう。

さて最初に『パーミッション』についての注意点でございますが、『root』さんまたは管理者権限を持つスーパーユーザーさんに関してはパーミッションとかそういうものの影響を一切受けずに常に全権限を持っている状態になります。

ちょいと細かい解説は後述しますが以下をみてみましょう。

[root@localhost ~]# echo 初音ミク > miku.txt
[root@localhost ~]# chmod 000 miku.txt
[root@localhost ~]# ls -l miku.txt
----------. 1 root root 13  9月 13 18:24 2018 miku.txt

『echo』コマンドで「初音ミク」という文字列を『miku.txt』なテキストファイルに書き込み(生成)して『chmod』コマンドという『パーミッション』を変更出来るコマンドで『000』を設定してみました。本来ならこのファイルは誰も触れないような状態になっています。しかし『cat』コマンドを使ってみると

[root@localhost ~]# cat miku.txt
初音ミク

余裕で出力できちゃってますね。

こんな感じで『パーミッション』というのは基本的に管理者権限を持っていない一般ユーザーとかに対する設定になりますので勘違いしやすい部分かもですが間違えないよう少し気をつけて下さい。

というわけで改めてやっていきましょう。

いつも通り『root』さんでCentOSにログインして頂きましてそのまま『root』さんのホームディレクトリである『/root』に『test.txt』っていうファイルを生成してみましょう。

[root@localhost ~]# touch test.txt

この状態でパーミッションを確認したいので『ls -al test.txt』と叩いてみて下さい。

[root@localhost ~]# ls -al test.txt
-rw-r--r--. 1 root root 0 Jul 23 05:37 2018 test.txt

『ls -al test.txt』で出力した内容のこの一番左側の部分から先頭の1文字だけ抜いた『rw-r--r--』って部分に注目です。これがこの『test.txt』の『パーミッション』に該当する内容になり、更にそのちょっと先の『root root』って部分がデータの所有者そのデータの所有グループになりましてUNIXの『パーミッション』まわりは所有者なんかもとっても重要になってくるのでこちらも確認する必要があるのでございます。なんだかわけわかめな感じもあると思いますのでいつも通り細かく見ていきましょう。

先頭の一文字を抜いた理由ですが、これはこちらの記事で解説した通りファイルの種類を教えてくれている項目で『パーミッション』とは関係ない部分でございますのでバシッとシカトした感じになります。もし忘れちゃった方がいればこちらの記事を読み返してみて下さい。

まずUNIX系OSのアクセス権では『オーナー』(そのデータの所有者)、『グループ』(そのデータの所有グループ)、『その他』という3つのカテゴリ分けがされている感じになっています。

『グループ』については前回の記事で解説したあれでございましてその対象『グループ』がどのような権限を持つかの設定、『その他』っていうのはそのままの意味で「その『グループ』にすら属していないユーザー」がどのような権限を持つかの設定になります。

ファイルやディレクトリ等を新規作成した場合の『オーナー』と『所有グループ』はその新規作成を行ったユーザーとそのユーザーが属しているプライマリグループが初期値として設定されます。

ここで先程の『rw-r--r--』って部分に注目してみましょう。注目するべきは9文字になっているというところですね。

この理由なんですがUNIX系OSの『パーミッション』の概念では先程解説した『オーナー』、『グループ』、『その他』という3つのカテゴリ分けごとに『r』(読出)、『w』(書込)、『x』(実行)という3つの権限を設定するようになっているので「3 × 3」で9文字になる感じになります。更に各設定が有効でない場合は『-』となる、といった感じですね。

そしてこの『パーミッション』の読み方なんですが左側から『オーナー』、『グループ』、『その他』という順番で3文字ずつ区切られていますので今回の『rw-r--r--』って場合だと『オーナー』が『rw-』、『グループ』が『r--』、『その他』が『r--』って設定がされているという事になります。

んで『r』と『w』と『x』の表記は必ず1文字目が『r』、2文字目が『w』、3文字目が『x』となりましてこの順番は必ず守られるので『xrw』になったり『--r』になったりなんて事は絶対にありません。例えば『r』と『w』と『x』を全て許容するならば『rwx』になる、という感じですね。

慣れてないとこの時点でかなりややこしいと思うのですがここまでは大丈夫そうでしょうか。

さて更にややこしい話になりますが先程紹介した『rw-r--r--』っていう表記以外に3桁の数字で『パーミッション』を表記するパターンがありましてコマンドとかを使って『パーミッション』を設定する場合は3桁の数字がよく使われるのでこちらもある程度覚えておかなくてはなりません。

どんな数字かというと全てのアクセスを許可する『rwxrwxrwx』って場合だったら『777』、誰でも実行は出来ないけど読み書きできる『rw-rw-rw-』だったら『666』、オーナーは読み書きできるけど他の人は読み込みだけ許可する『rw-r--r-』だったら『644』といった感じですね。

この数字はどうやって決められているかというとこれがまたややこしく「『r』や『w』や『x』が設定されていればそれを1、『-』だったら0という2進数表記に変えて更にその数値を8進数に変換したもの」なんていう感じになっています。

例えば『rw-r--r--』だった場合を考えてみます。これを『オーナー』、『グループ』、『その他』の3つに分けてそこに半角スペースを入れると『rw- r-- r--』ってなりますよね。んで2進数に一旦変換する必要があるので『-』じゃなければ1、『-』だったら0を当てはめてあげます。すると『110 100 100』ってなりますのでその『110』とか『100』とかを更に8進数に変換すると『6 4 4』となり、つまり『rw-r--r--』は『644』になるという感じですね。

「かなりカオスでファンタスティックだなー(´・ω・`)」と思った方も多いですよね、胸中お察し致します。この覚え方のコツなんですが算出方法は覚えなくてOKというか一覧をメモしておくなりググるなりしてしまえばOKってのが覚える(?)コツでございます。

著者も何十年もプログラミングをやってるわけなんですがこれについては主要なやつ以外はさっぱり覚えておりません。この『パーミッション』は最低値が『000』、最大値が『111』になるわけで8進数と言いつつも長年プログラミングをやってる人ならば手慣れたもんであろう16進数で変換するのとなんら変わらないわけでございますが『読出』と『書込』と『実行』の順番あたりで記憶が曖昧になってしまって「あれ?この場合は『666』だっけ?それとも『644』だっけ?(*´ω`*)」とゲシュタルト崩壊してしまうわけなのでございます。しかもミスすると怖い部分なのでそれもまた嫌な感じなんすよねー。

というわけで皆様も特に覚えなくてOKという事で以下によく使われるやつの一覧(4つ)を貼っておきます。こちらを参考にしちゃえばOKでございます。

777rwxrwxrwx
755rwxr-xr-x
666rw-rw-rw-
644rw-r--r-

あとファイルとかディレクトリにパーミッションを設定する場合で上記の3桁の数字を使わないで設定する方法もあるのでどちらかというとそっちを使わない方がおすすめかもしれませんね。これについては次の記事で解説します。

※2進数とか8進数とか16進数についてはこの辺を参照して下さい。

そしてこの『パーミッション』は
「どういう時にどういう設定をすればよいのか」、
「今日は好きなあの子との初デートだしここはやっぱ全てを許可する『777』かな?(*'▽'*)」、
「でもいきなり全てをさらけ出すのもちょっと不安だしここは『666』くらいかな?(*'ω'*)」、
「んーでもさらけ出しすぎてもし嫌われちゃったりしたらどうしよーってなっちゃうしやっぱ『644』くらいかな?(´・ω・`)」、
「ああーもーどうしよー緊張しすぎてむりー!『000』だー!(:_;)」
ってなってしまうかと思いますがこれについてはかなりのパターンがあってそれぞれを紹介していくのはほんと無理なので適宜対応していくしかない感じになっています。

基本的に「その状況で必要な最低限の権限のみを設定するようにする」って意識を常に持つ感じでOKです。まあ最近はネットの情報が昔とは桁違いに充実していますのでまずググってみてその情報を確認しつつ入れていくような流れになると思います。

そしてこの際に「必ず確認する」って作業は必ず入れて下さいね、ネットに限らず世間の情報の8割以上が間違っていたり的外れだったり偏向されてたりしますので「情報を疑う」という心構えはほんと大切でございます。ミスがないよう気を付けておりますがこの勢いで当サイトの情報も全力で疑って頂ければと思います。

さて話を戻しまして『パーミッション』は基本的な部分は同じなのですが対象がファイルである場合とディレクトリである場合で大分違いがありますのでそれを確認していきましょう。

なんのこっちゃって話なのですが先ほどの話で『r』(読出)、『w』(書込)、『x』(実行)っていうのがありましたよね。

これディレクトリになると

rディレクトリの中身を確認できるかどうか。つまりディレクトリの中身(一覧)を表示できるかどうか(要するに『ls』コマンド)という事でこれのみが許可されていてもファイルの中身や権限などは確認出来ない。
wディレクトリの中にファイルやディレクトリを新規で作成したり元々あるファイルやディレクトリを削除したり出来るかどうか。ただしこれを許可する場合は同時に『w』も許可されている必要がある。
xそのディレクトリの中身のデータにアクセス出来るかどうか。この設定は内部のディレクトリ全てに再帰的に適用される。

って感じになります。

ちょっとややこしいので細かくみていきましょう。まず適当に『/home/test/hoge』なんてディレクトリを生成して更に『/home/test/hoge/hoge.txt』なんてファイルと『/home/test/hoge/hoge1』なんてディレクトリを作りましてですね、その権限を以下のように変更してみます。

d---------. 2 test test 4096  Sep 21 20:43 2018 .

オーナーが『test』くんで、『パーミッション』は『---』なので何も許可されていない状態ですね。この状態で『test』くんにユーザーを切り替えて『ls -al /home/test/hoge/』なんて叩いてみても

[test@localhost root]$ ls -al /home/test/hoge/
ls: cannot open directory /home/test/hoge/: Permission denied

なにも表示されないですね。次に以下の状態に変更します。

dr--------. 2 test test 4096  Sep 21 20:43 2018 .

今度は『パーミッション』は『r--』なので『r』のみが許可されてる状態ですね。これで『ls -al /home/test/hoge/』と叩いてみると

[test@localhost root]$ ls -al /home/test/hoge/
ls: cannot access /home/test/hoge/hoge.txt: Permission denied
ls: cannot access /home/test/hoge/hoge1: Permission denied
ls: cannot access /home/test/hoge/.: Permission denied
ls: cannot access /home/test/hoge/..: Permission denied
total 0
d????????? ? ? ? ?                  ? .
d????????? ? ? ? ?                  ? ..
d????????? ? ? ? ?                  ? hoge1
-????????? ? ? ? ?                  ? hoge.txt

「許可されてないよー」って怒られつつもディレクトリの中身(ファイル名等)はギリ確認出来てますね。ただ『パーミッション』とか『オーナー』とかそういうのは出力されていません。

続いて権限を以下のように変更します。

drw-------. 2 test test 4096  Sep 21 20:43 2018 .

今度は『rw-』なので『w』もOKになってます。『w』はディレクトリの中にファイルとかを新規作成できたりできるようになるはずなので『echo "初音ミク" > /home/test/hoge/miku.txt』なんて叩いてみると

[test@localhost root]$ echo "初音ミク" > /home/test/hoge/miku.txt
bash: /home/test/hoge/miku.txt: Permission denied

「許可されてねえぞ」って怒られちゃいましたね。

なぜこんな事が起こるのかというと『x』が許可されていないからです。UNIX系OSでは『inode』っていう各データの所有者や更新日時やファイルサイズなどの属性みたいなのが書かれている情報が見えないところでこっそり用意されているのですが『x』が許可されてないとこれにアクセス出来ないのでファイル作成とかそういうのが一切出来ない状態になるんですね。

この「『x』が許可されてないとほぼ何も出来ない」っていうのは有名書籍でも解説がなかったりするので要注意でございます。「情報を疑う」というのはとても大切な心構えだなというか著者が子供の頃に読んだ参考書とかもそんな感じになっておりまして中々困ったもんでございますね。全てのOSで試したわけではないのですが多分どのUNIX系OSでもそんな感じになっておるはずです。

なので先に『x』を許可しないと始まらないので許可してみましょう。つまりはこんな感じですね。

d--x------. 2 test test 4096  Sep 21 20:43 2018 .

『x』を許可するとその対象ディレクトリをカレントディレクトリとする事ができる、つまり『cd』コマンドで移動できるようになります。

[test@localhost root]$ cd /home/test/hoge/
[test@localhost hoge]$

んで今現在は『w』のみが許可されているので『ls』コマンドで一覧を表示してみてもNGで『echo "初音ミク" > ./miku.txt』なんてのもNGになります。

[test@localhost hoge]$ ls
ls: cannot open directory .: Permission denied
[test@localhost hoge]$ echo "初音ミク" > ./miku.txt
bash: ./miku.txt: Permission denied

ここで『r』と『w』を許可すると上記のコマンドもOKになるわけでございます。

[test@localhost hoge]$ echo "初音ミク" > ./miku.txt
[test@localhost hoge]$ ls
hoge.txt  hoge1  miku.txt

あと「ディレクトリのパーミッションとそのディレクトリの中のファイルのパーミッションとの兼ね合いはどうなるのー?(*'▽'*)」って思った方がいらっしゃると思います。これについてはズバリ「両方適用されます!」でございます。

例えばディレクトリ側のパーミッションで全て許可されていても対象ファイルのパーミッションが全て不許可だったならばそのファイルにアクセスすることはできません。

なので最初にディレクトリのパーミッションの判定が入る → 次に中身のファイル等のパーミッションの判定が入るって流れになりますね。

これを知らないと「ファイルのパーミッションを777にしてるのにファイルにアクセス出来ないよー(:_;)」ってなりがちなのでバッチリ覚えておくようにして下さい。著者が開発のお手伝いをしてる現場のプログラマーさんもこれでハマってる人はかなり多いですね。

そして『x』の設定は再帰的に適用されるってのもご注意です。再帰的っていうのはつまり中身のディレクトリ等全てに適用されるって意味になりますので逆に言うと先祖ディレクトリに『x』が不許可なものが1つでもあればそこから先の中身のデータにはアクセスすることは出来ないって状況になっちゃいます。ここもハマりやすいポイントになりますので要注意ですね。

というわけで『パーミッション』の基本的な概要については以上となります。

多分この段階で「よく分からないぜー(:_;)」って方も多いと思いますが次の記事で『パーミッション』とか『所有者』とかの変更方法について解説していきますのでもし分からなくてもあまり気にせず次の記事に進んじゃって下さい。

著者の経験的にこういうのは手を動かしながら覚えていくのがベストかなって感じでございます。

ではこの辺で。またお会いしましょう。

この記事は桜舞が執筆致しました。

著者が愛する小型哺乳類

桜舞 春人 Sakurama Haruto

ISDN時代から様々なコンテンツを制作しているちょっと髪の毛が心配な東京在住のプログラマー。生粋のロングスリーパーで、10時間以上睡眠を取らないと基本的に体調が悪い。好きなだけ寝れる生活を送るのが夢。ゲームとスポーツと音楽が大好き。誰か髪の毛を分けて下さい。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。