前回、LinuxやMac OS X、*BSDではパーミッションがファイルやディレクトリの基本的な保護機能であることを説明した。各ファイル/ディレクトリのパーミッションは、lsコマンドに-lオプションを指定することで確認できる。パーミッションは、「持ち主」、「持ち主の所属しているグループの人」、「それ以外の人」の3種類に対して設定できることもご理解いただけたはずだ。

それらを踏まえ、今回はファイルとディレクトリのパーミッションについて、具体的な内容を挙げながら説明する。特にディレクトリのパーミッションについては、なぜそんな設定になっているのかを知らない方が多いと思うので、その辺りをつかんでいただきたい。

ファイルのパーミッション

ユーザーが扱う一般的なファイルには、「rw-r—r—」のようなパーミッションが設定されていることが多い。これは、ファイルの持ち主であるユーザーはファイルの読み書きができるが、それ以外のユーザーは中身を読めるだけということを意味している。LinuxやMac OS X、*BSDでは、基本的にこれがデフォルトの設定になっていることが多い。

インタラクティブシェル「bash」の設定ファイル(~/.bashrc)のパーミッション

公開鍵のように、公開されても問題のないデータも基本的には「rw-r—r—」という設定になっている。他人に見られても、問題ないからだ。いったん作成した公開鍵はもう編集することはないだろうから、ここは別に「r—r—r—」となっていてもよい。

SSH公開鍵(~/.ssh/id_rsa.pub)のパーミッション

一方、秘密鍵のようにほかのユーザーに見られると困るファイルもある。その場合、次のように「rw———-」が設定される。本人だけが編集できて、ほかのユーザーは中身を読むこともできない。これも、先ほどと同じ理由で「r————」となっていてもかまわない。

SSH秘密鍵(~/.ssh/id_rsa)のパーミッション

また、システムの設定ファイルの場合には次のようなパーミッションが設定されることが多い。

SSHサーバのデフォルト設定ファイルのパーミッション

持ち主がroot(管理者ユーザー/スーパーユーザー)になっており、パーミッションが「rw———」なので、rootのみが編集でき、それ以外のユーザー(一般ユーザー)は設定内容を確認することもできない。

もう1つ知っておいたほうが良い典型的なパーミッションが、実行ファイルのパーミッションだ。実行ファイル(コマンド、アプリケーション、シェルスクリプトなど)のパーミッションは、「x」が付いて「rwxr-xr-x」のようになっている。

実行ファイルのパーミッション

これは、rootは編集も実行も可能であり、それ以外のユーザーはコマンドの読み込みと実行ができる状態を表している。

コマンドやアプリケーションの実行を許可するだけならば、「—x—x—x」でも良いじゃないか、と思われるかもしれないが、それだと実行できない。読み込みを許可する「r」が指定されていないと、そもそもその中身を読み込むことができないので、実行も何もないわけだ。

これまでファイル・パーミッションを意識したことがないのであれば、cdコマンドとlsコマンドを繰り返し実行して、いろいろなパスにあるファイルのパーミッションを調べてみてほしい。システムがどういった意図を持って構築されているのかが、今までよりもよく理解できるようになるだろう。

ディレクトリのパーミッション

ファイルのパーミッションとディレクトリのパーミッションは、lsコマンドの出力では同じ「rwx」の表記が使われているが、その意味が異なっている。以降では、いくつかの例を挙げながら、その違いを説明しよう。

まず、ユーザーのホームディレクトリ(ログインしたときに最初に出ているパス)のパーミッションを見てみよう。ちなみに下記の画面では、lsコマンドに「-d」というオプションも指定している。これは、「ディレクトリそのものについて表示せよ」という意味のオプションだ。これを指定しないと、ディレクトリ下のファイルなどの情報まで表示されてしまい、説明の邪魔になるからだ。多用するオプションではないが、知っておくとたまにこうして役に立つことがある。

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

ここでは、ホームディレクトリに「rwx———」というパーミッションが設定されている。これは、持ち主のユーザーだけに「ホームディレクトリ以下のファイルやディレクトリの一覧の取得」、「ホームディレクトリ以下に新しいファイルやディレクトリを作成」、「ホームディレクトリ以下のファイルやディレクトリの編集(実行)」が許可されていることを意味している。

ファイルにおけるパーミッションは直感的に理解しやすかったと思うが、ディレクトリに対するパーミッションはちょっと難しく感じるかもしれない。「ディレクトリとは、ディレクトリ以下に配置するファイルやディレクトリの名前を書き込んだファイルである」と思ってもらうとわかりやすいだろう。

そう考えると(と言うか、実際そうなのだが)、ディレクトリに「r」を指定→ディレクトリの中身を読める→ディレクトリ以下のファイルやディレクトリの一覧が見える、ということになる。「w」に関しても同様に、ディレクトリに「w」の指定→ディレクトリの中身に書き込みができる→ディレクトリ以下に新しくファイルやディレクトリのエントリを追加できる、というわけだ。

「x」に関しては、ディレクトリ以下のファイルの編集を許可するか否かという指定なので、このまま覚えるしかないかもしれない。ちなみに、ディレクトリに「w」を許可して「x」を許可しなかった場合、ディレクトリ以下に新しくファイルやディレクトリを追加することはできない。

この辺りを理解しておけば、一般ユーザーが作成するディレクトリのパーミッションが次のようになるのは何となく理解できるだろう。

ユーザーが作成するディレクトリのパーミッション

これはCentOS 7の例だが、この場合ユーザー名が「daichi」、グループ名が「daichi」であり、ほぼこのユーザー専用の状態になっているので、パーミッションは「rwxrwxr-x」になっている。Mac OS Xのように、ここが「rwxr-xr-x」になっているケースもある。

一方、システムの設定ファイルが格納されたディレクトリのパーミッションになると、次のように「rwxr-xr-x」が設定されている。

システムの設定ファイルのパーミッション

これは、基本的にrootだけが編集できる設定だ。ルートディレクトリのように、rootですら編集する必要がない場所はさらに規制が厳しくなり、次のように「r-xr-xr-x」が設定される(「別にrootが書き込めても良い」という判断で「rwxr-xr-x」になっているシステムもある)。

ルートディレクトリのパーミッション

同様に、コマンドなどが格納されたディレクトリも基本的に書き換える必要がないので「r-xr-xr-x」(もしくは「rwxr-xr-x」)になっている。

コマンドが納められたディレクトリのパーミッション

ディレクトリのパーミッションは直感的には理解しにくいが、それほど設定パターンは多くないので、システムをcdコマンドで移動して周り、典型的なパーミッションだけ覚えておくと良いだろう。

今回のおさらい

今回のおさらいは、次のとおりだ。

  • 「ls -ld」でディレクトリのパーミッション情報を表示
  • ファイルの「r」は読み込み許可
  • ファイルの「w」は書き込み許可
  • ファイルの「x」は実行可能指定
  • ディレクトリの「r」は配下のファイルやディレクトリの一覧取得許可
  • ディレクトリの「w」は配下に新しくファイルやディレクトリのエントリを追加する操作許可
  • ディレクトリの「x」は配下のファイルやディレクトリの編集(実行)許可

特にディレクトリのパーミッションは意味を忘れがちなので、いろいろなディレクトリの設定を見て、慣れておいていただきたい。