Linuxではディレクトリなどを含むファイルにパーミッション(許可)や所有者、グループを含む属性がある。各ファイルに所有者(user)、グループ(group)、他人(other)にそれぞれ読込可能(r, 4)、書込可能(w, 2)、実行可能(x, 1)が設定され、これによってアクセス制御を行う。これは許可リストといえる。他人はWindowsでのEveryoneと同じと考えることができるだろう。
また、Linuxにはユーザとグループのリストがあり、ユーザは複数のグループに所属することができる。ユーザにはrootやログインユーザだけでなく、必要に応じてWebサービスなど特定のサービスのためのユーザが存在する。
ファイルパーミッションは ls -l コマンドで表示することができる。デフォルトでは ll コマンドでも似たような表示が可能だろう。表示例として、adirディレクトリを作成し、その中でa.txtファイルとbdirディレクトリを作成したときの結果を示す。
左側に表示されている「-rw-r--r--」と「drwxr-xr-x」という部分に注目する。左から種類、所有者読み込み許可、書込許可、実行許可、グループ読込許可、書込許可、実行許可、他人読込許可、書込許可、実行許可となっている。「cpage cpage」というところはファイルの所有者がcpage、グループがcpageであることを示している。
アクセス許可部分の意味としては、a.txtは所有者cpageには書込と読込が許可されており、cpageグループおよび他人には読込が許可されている。 bdirには所有者cpageには読込と書込、実行(ディレクトリの場合は中に入れること)が許可されており、cpageグループおよび他人には読込と実行が許可されている。
他人についてファイルパーミッションを変更してみる。a.txtに対して他人に書込を許可する。コマンドは chmod o+w a.txt である。これで誰でもa.txtファイルを編集することができるようになった。
chmodコマンドは第一引数に「許可対象+許可内容」または「許可対象-不許可内容」、第二引数にファイル名を指定する。許可対象はuならば所有者、gであればグループ、oであれば他人である。許可内容と不許可内容は読込がr、書込がw、実行がxである。+の代わりに-とした場合は、許可を取り消す意味である。第一引数は3桁の数値を使って一度にすべて設定することができる。数値は「777」であれば全員にすべて許可、「666」であれば全員に読込と書込を許可、「644」であれば所有者に読込と書込、グループと他人に読込を許可である。各数値は4は読込、2は書込、1は実行の組み合わせてある。
あるファイルがrootのみが書込が許可されている場合、つまり私cpageユーザアカウントでは書き込むことができないファイルに書き込むにはどうしたら良いだろうか?方法の1つとしては、sudoコマンドを使ってパーミッションを変更する。sudo chmod o+w a.txtというふうにすれば良い。他の方法としてはroot権限者のみが実行できるchownコマンドで所有者を変更する方法がある。どうするかが良いかはそのファイルやディレクトリをどのように使うかによって変わってくるだろう。
ファイルを作成するときのデフォルトパーミッションはumaskによって設定する。現在の値はumaskコマンドで表示できる。私の環境ではumaskは「0022」と表示された。この場合1桁目は除き、2桁目が所有者、3桁目はグループ、4桁目は他人が対象であり、数値の内容は不許可である。この場合、所有者にはすべて許可、グループと他人には書込を不許可となる。また、実行可能ファイル以外のテキストファイルにはxは付かないようである。umaskは引数を指定すれば変更可能である。
パーミッションは他にもset-usr-ID(setuid)とset-group-ID(setgid)、stickyの3つの特殊な属性がある。setuidは実行時に所有者の権限を引き継ぐという意味である。setgidの場合はグループである。「ls -l /usr/bin」を実行すると、「passwd」は「-rwsr-xr-x 1 root root 59640 3月 23 2019 passwd」と表示されるが左から4文字目が「s」となっている。これはsetuidが設定されいるということである。各ユーザアカウントでroot権限の自分のパスワード変更が可能になる仕掛けである。他の情報はウィキペディアなどを参照すること。
パーミッションにはスティッキービットというものもある。「ls -l /」を実行すると「drwxrwxrwt 17 root root 4096 7月 9 04:39 tmp」という行がある。この左から10文字目が「t」となっているがこれがスティッキービットである。tmpディレクトリは各プログラムが一時的に保存するファイルが置かれるが、誰でも変更可能というのはデータ破壊やセキュリティ上のリスクになりえる。スティッキービットはファイルの所有者以外の一般権限では書込を禁止する。他の情報はウィキペディアなどを参照すること。
ユーザ一覧はcat /etc/passwdコマンドで確認できる。私の環境で実行したときの表示の一部を示す。
$ cat /etc/passwdroot:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin(略)www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin(略)cpage:x:1000:1000:cpage,,,:/home/cpage:/bin/bashnginx:x:122:129:nginx user,,,:/nonexistent:/bin/falseカラム区切りで、「ユーザ名:パスワードを示すX:ユーザID:グループID:ユーザ作成時のコメント:ホームディレクトリ:使用するシェル」の内容が示される。
ユーザのみを表示するには cut -d: -f1 /etc/passwd とすればよい。
/etc/passwdファイルは編集してはならない。ユーザ情報の変更はusermodコマンド、パスワードの変更はpasswdコマンド、ユーザの追加はuseraddコマンドで行う。
グループ一覧はcat /etc/groupコマンドで確認できる。私の環境で実行したときの表示の一部を示す。
$ cat /etc/grouproot:x:0:daemon:x:1:bin:x:2:sys:x:3:adm:x:4:syslog,cpage(略)www-data:x:33:(略)cpage:x:1000:sambashare:x:128:cpagenginx:x:129:ユーザの情報を得るコマンドはいくつかある。ログイン中のユーザはwhoamiコマンドで表示する。wコマンドではuptimeコマンドやwhoコマンドを組み合わせた内容を表示する。
$ w 04:14:19 up 9:28, 1 user, load average: 0.01, 0.04, 0.06USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATcpage tty7 :0 18:46 9:27m 3:48 0.44s cinnamon-session --session cinnamonidコマンドとgroupsコマンドはユーザの所属しているグループを表示する。私の環境で実行結果を示す。
$ id cpageuid=1000(cpage) gid=1000(cpage) groups=1000(cpage),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),112(lpadmin),128(sambashare)$ groups cpagecpage : cpage adm cdrom sudo dip plugdev lpadmin sambashare