Linuxについて [管理者権限とユーザ•アクセス権限]

## 管理者の仕事


システム管理には、ユーザの作成•削除、ユーザパスワードの設定、グループの作成や変更•削除などがある


### グループとユーザ

Linuxを利用するには**ユーザアカウント**が必要であり、取得することでユーザがLinuxというシステムの利用権限を持つことになる
また、グループを使えば複数のユーザを束ねることができる
グループとユーザを適切に設定するとファイルやディレクトリ、任意のプログラムやシェルスクリプトなどを必要なユーザにのみ参照・編集する
権限や実行する権限を与えることができる


### ユーザの作成

#### useradd ユーザ名

新しくユーザを作成する
ユーザには数字であるユーザIDを割り振り、ユーザは必ずグループに所属する

オプション|意味
-|-
-c コメント|コメント(文字列)を指定
-g グループ名|プライマリグループ名を指定し、グループ名は/etc/groupファイルで定義したグループ名
-G グループ名|補助グループを指定
-d|ホームディレクトリを指定
-s|シェルを指定し、デフォルトで/bin/bashが指定されているディストリビューションが多く、ログインしないユーザはnologinを指定するなど行う
-u ユーザID番号|ユーザID番号を指定


~~~
# useradd owl
# ls /home/
owl
~~~

１行目でユーザを作成
２行目でhomeディレクトリを確認し作成されているか見る

これでユーザowlを作成

#### ユーザIDの指定

ユーザIDを指定するために、まずはユーザID番号1001のユーザが/etc/passwdファイルにすでに登録されていないか調べる
その後にusersグループに所属するユーザIDが1001のpenguinユーザを作り、/etc/passwdファイルにpenguinユーザが作成されたかgrepで確認

~~~
# grep 1001 /etc/passwd
# useradd -g users -u 1001 penguin
# grep penguin /etc/passwd
penguin:x:1001:100::/home/penguin:/bin/bash
~~~

１行目で当てはまる行がなければユーザIDは未登録
２行目でユーザを作成
３行目で作成されたユーザを表示

### ユーザアカウントの変更

#### usermod ユーザ名

ユーザのアカウントを変更する

オプション|意味
-|-
-c コメント|コメント(文字列)を変更
-g グループ名|プライマリグループ名を変更。グループ名は/etc/groupファイルで定義したグループ名
-G グループ名|補助グループを変更
-l|既存のユーザ名を変更
-u ユーザID番号|ユーザID番号を変更


### ユーザの削除

#### userdel ユーザ名

ユーザを削除する

オプション|意味
-|-
-r|ホームディレクトリを削除


~~~
# grep penguin /etc/passwd
penguin:x:1001:100:LPIJapan
Certification:/home/penguin:/bin/bash
# userdel penguin
# grep penguin /etc/passwd
#
~~~

１行目で登録されているpenguinユーザの情報を確認
４行目でpenguinユーザを削除
５行目でpenguinユーザの情報を確認
６行目でユーザが削除されたので表示されない

### グループ

複数のユーザの権限をまとめて扱うためにグループを使う
ユーザは**必ず1つ以上のグループに所属**しており、**主に所属するグループをプライマリグループ**と呼ぶ
最初から用意されているグループに加え、システム管理者が必要に応じてグループを定義することができる


### グループの作成


#### groupadd グループ名

新しくグループを作成する
グループには数字のグループIDを割り振る

オプション|意味
-|-
-g グループID番号|グループID番号を指定


~~~
# grep 1001 /etc/group
# groupadd -g 1001 linuc
# grep linuc /etc/group
linuc:x:1001:
~~~

１行目でグループIDがすでに利用されていないことを確認
２行目で新しいlinucグループを作成
３行目で作成したグループを表示


### グループの登録情報変更

#### groupmod [-g gid] [-n new-group-name] 変更対象のグループ

グループの定義を変更する

オプション|意味
-|-
-n|既存のグループ名を変更する場合に指定
-g|既存のグループIDを変更する100未満のグループIDはシステムで使われているため、指定できない

~~~
$ groupmod -n penguin dolphin
$ groupmod -g 777 penguin
~~~

１行目でdolphinグループをpenguinグループに名前変更
２行目でpenguinグループIDを777に変更


~~~
# grep linuc /etc/group
linuc:x:1001:
# groupmod -n linux linuc
# grep linux /etc/group
linux:x:1001:
~~~

１行目で登録されているグループの表示
２行目でグループ名の変更
３行目で変更されたグループ名の表示


### グループを削除

#### groupdel グループ名

グループを削除する
groupdelコマンドでは登録されているグループの情報を削除する
**ユーザが所属していないグループのみ削除できる**


~~~
# grep 1001 /etc/group
# groupadd -g 1001 linux
# grep linux /etc/group
linux:x:1001:
# groupdel linux
#grep 1001 /etc/group
#
~~~

１行目で"1001"を鍵としてグループID1001のグループを作成するため/etc/group内を検索
２行目でグループID1001のグループlinuxを作成
３行目で作成したグループを確認
５行目でグループlinuxを削除
６行目で削除されたグループを確認
７行目ではグループが削除されたので何も表示されない

## パスワードとパスワードファイル

* グループの定義
  /etc/groupファイル(グループファイル)に記述

* ユーザの定義
  /etc/passwdファイル(パスワードファイル)に記述

* パスワード
  ユーザを利用するにはパスワードが必要
  /etc/shadowファイル(シャドウファイル)に暗号化されて記録
  パスワードの変更はpasswdコマンドを使っておこなう

### パスワードファイル

ユーザの情報は/etc/passwdファイル(パスワードファイル)に保存され、1行に1ユーザの情報を:で区切って記述される

~~~
account:password:UID:GID:GECOS:directory:shell
~~~

項目|内容
-|-
account|そのシステムでのユーザ名。大文字を含まないようにするpassword|以前はユーザの暗号化されたパスワード、現在は'x'です
UID|ユーザID番号
GID|ユーザが属するプライマリグループID番号
GECOS|ユーザの名前またはコメントのフィールド
directory|ユーザのホームディレクトリ
shell|ログイン時に起動されるユーザのコマンドインタプリタ


多くのディストリビューションはセキュリティを考慮してシャドウファイルにパスワードを記述している


### グループファイル

グループの情報は/etc/groupファイル(グループファイル)に保存され、1行に1グループの情報を:で区切って記述される

~~~
group_name:password:GID:user_list
~~~

項目|内容
-|-
group_name|グループの名前
password|以前は暗号化されたグループのパスワード、またはパスワードが不要なら空欄
GID|グループID番号
user_list|グループに所属するユーザ名のリスト。それぞれのユーザ名はコンマで区切られる。


<font color="red">グループファイルはエディタで直接編集するべきではない</font>
groupaddコマンドなどのコマンドを使って操作することが推奨されている


### パスワード

ユーザ権限を使うにはユーザ名とパスワードを使って認証
パスワードの登録にはパスワードが必要なので、初めてパスワードを変換するのはシステム管理のための
**rootユーザ(スーバーユーザ)である必要がある**

#### passwd [ユーザ名]

ユーザのパスワード登録と変更ユーザのパスワードを登録したり、変更したりする

たとえばrootユーザでpenguinユーザのパスワードを変更する場合

~~~
# passwd penguin
新しいパスワード:xxxxxxxx
新しいパスワードを再入力してください:xxxxxxxx
passwd:全ての認証トークンが正しく更新できました。
# exit
CentOS release 6.3 (Final)
Kernel 2.6.32279.1.1.el6 on an i686
localhost login: penguin
Password: xxxxxxxx
Last login: Wed Jul 18 10:10:10 from 192.168.1.100
$
~~~

1行目でユーザpenguinのパスワードを変更
５行目でrootユーザをログアウト
８行目でユーザ名を入力
９行目でパスワードを入力
１０行目ではユーザログインに成功するとプロンプトが表示されている




### シャドウファイル

ユーザのパスワードはパスワードファイルではなく、シャドウファイル(/etc/shadow)に保存される

~~~
account:password:last_changed:may_be_changed:must_be_changed:warned:expires:disabled:reserved
~~~

項目|内容
-|-
account|ユーザ名
password|暗号化されたパスワード
last_changed|1970年1月1日から、最後にパスワードが変更された日までの日数
may_be_changed|パスワードが変更可能となるまでの日数must_be_changed|パスワードを変更しなくてはならなくなる日までの日数
warned|パスワード有効期限が来る前に、ユーザが警告を受ける日数
expires|パスワード有効期限が過ぎ、アカウントが使用不能になるまでの日数
disabled|1970年1月1日からアカウントが使用不能になる日までの日数(Linuxシステムが基準としている時間である)
reserved|予約フィールド


## 用意されているユーザとグループ

Linuxはインストールしてすぐに利用できるように、ユーザとそのユーザが所属するグループが用意されている
ユーザやグループは必要に応じて複数追加可能


### 一般のユーザとグループ
アカウントを作成するとユーザ名と同様の名前のグループが作られ、ユーザグループに所属している、とシステムに登録される
個別のユーザを所属部署などの単位でグループ化することが可能で、システム上にあるディレクトリのアクセス権を設定し、特定のグループに属したユーザのみアクセスできるディレクトリを作成したり、特定グループに属しているユーザのみrootユーザになることが可能となる

### rootユーザ

システム設定の変更や、プログラムのインストールや削除、ユーザを作成・削除する事ができ、利用に制限がなし
また、アクセス権に関係なくすべてのユーザのディレクトリへのアクセス、コンテンツの読み書きが行なえる


### suコマンド

suコマンドはすでに別のユーザでログインしているユーザが、一時的に他のユーザになるためのコマンド
カレントディレクトリをrootのホームディレクトリに変更してログインするには**su-**、もしくは**su-root**と実行することでカレントディレクトリを変更した上でrootユーザでログインできる
複数人でLinuxシステムを管理している場合、rootユーザで直接ログインすると、rootユーザとしての履歴だけが残り、誰がどんな作業をしたのかの履歴が残らない
一般ユーザからrootユーザへ切り替えると、rootユーザで作業を開始した時間などはすぐにわかる


#### su - [ユーザ]

オプション|意味
-|-
su - (もしくはsu - root)|rootユーザになることができる
su - user|指定ユーザになることができる


ユーザからrootユーザになる

~~~
$ cat /var/log/messages
cat: /var/log/messages: 許可がありません
$ su -

パスワード：xxxxxx
# cat /var/log/messages
Mar 20 08:51:46 localhost syslogd 1.4.1:restart.
Mar 20 08:51:46 localhost kernel: klogd 1.4.1, log source =
/proc/kmsg started.
(略)
~~~

３行目でrootユーザへ移行

**ユーザ権限では見られないログファイルをroot権限になると閲覧できるようになる**


### rootユーザでコマンドを実行するsudoコマンド

sudoコマンドを使えば、スーパーユーザ（root）権限でコマンドを実行可能
CentOSでは初期設定のままではsudoコマンドは利用できないので、使うにはユーザをwheelグループというスーパーユーザ（root）特権を持つグループに登録する必要がある
sudoの設定は/etc/sudoersファイルを編集することでユーザがsudoコマンドを利用できるようになる
/etc/sudoersファイルは**visudoコマンド**を実行すると編集できる

#### sudo

スーパーユーザ（root）権限でコマンドを実行

オプション|意味
-|-
-u ユーザ|指定したユーザでコマンドを実行

sudoを使いたいpenguinユーザをwheelグループの所属にし、visudoコマンドで/etc/sudoersファイルを編集してwheelグループの定義を有効にする

~~~
$ visudo
visudo: /etc/sudoers: Permission denied
visudo: /etc/sudoers: Permission denied
# su-
パスワード:xxxxxx
# usermod -G wheel penguin
# vigr
wheel:x:10:root
↓
wheel:x:10:root,penguin
# visudo
# %wheel             ALL=(ALL)     ALL
↓
  %wheel             ALL=(ALL)     ALL
# su - penguin
$ sudo visudo
[sudo] password for penguin:xxxxxx
~~~

１行目でユーザpenguinでvisudoを実行
２、３行目では管理権限を持たないユーザではvisudoを実行できていない
５行目でsuコマンドにより管理者権限を使ってwheelグループにユーザpenguinを追加
６行目でwheelグループにユーザ追加されたか確認
９行目でwheelグループを有効に設定
１５行目ではrootユーザがsuするときは、パスワード入力不要
１６行目ではユーザpenguinは管理グループに所属するユーザなのでvisudoを実行可能
１７行目でコマンドを実行するユーザのパスワードを入力する

~~~
%wheel             ALL=(ALL)     ALL
~~~

/etc/sudoersファイルにあるこのオプションを有効にすると、wheelグループに所属するユーザがsudoコマンドを実行した場合、パスワードを聞かれることなくコマンドを実行できるようになる
この設定はデフォルトでは無効化されている

## ユーザ権限とアクセス権限

### ファイルの所有者と所有グループ

ファイル作成者のユーザIDとグループIDがファイルの所有者と所有グループとなる

#### chown ユーザ[.グループ] ディレクトリとchown ユーザ[.グループ] ファイル

ファイルの所有者を変更する
ユーザとグループを変更するには、rootユーザである必要があるが、ディレクトリとファイルは区別なく変更可能
ユーザとグループの区切りに:を使うことも可能

オプション|意味
-|-
-R|ディレクトリを対象に、ディレクトリの中のディレクトリやファイルを再帰的にたどって変更する


~~~
$ touch user
$ ls -l user
-rw-r--r-- 1 penguin linuc 0 2月 9 12:39 user
$ chown nobody user
chown: `users' の所有権を変更中: 許可されていない操作です
$ su
パスワード:xxxxxxxx
# chown nobody user
# ls -l user
-rw-r--r-- 1 nobody linuc 0 2月 9 12:39 user
~~~

1行目でファイルを作成
2行目でファイルの所有者と所有グループを表示
3行目で現在の所有者がpenguinで所有グループがlinuc
4行目で一般ユーザでファイルの所有者を変更
5行目で一般ユーザで変更不可エラーが表示される
6行目でrootユーザへ移行
7行目でrootユーザのパスワード入力
8行目でnobodyユーザへ所有者を変更
10行目で変更後の所有者を表示


### 所有グループの変更

#### chgrp グループ ディレクトリと chgrp グループ ファイル


オプション|意味
-|-
-R|ディレクトリを対象に、ディレクトリの中のディレクトリやファイルを再帰的に変更


ファイルの所有グループを変更する


~~~
$ touch groups
$ ls -l groups
-rw-r--r-- 1 penguin linuc 0 2月 9 12:39 groups
$ chgrp nobody groups
chgrp: changing group of `groups': 許可されていない操作です
$ su
パスワード: xxxxxxxx
# chgrp nobody groups
# ls -l groups
-rw-r--r-- 1 penguin nobody 0 2月 9 12:39 groups
~~~

１行目でファイルを作成
２行目でファイルの所有グループを表示
３行目で現在の所有グループを表示
４行目で一般ユーザでファイルの所有グループを変更
５行目で一般ユーザで権限の変更が不可であるとエラー表示されている
６行目でrootユーザへ移行
７行目でrootユーザのパスワード入力
８行目でnobodyグループへ所有グループを変更
１０行目で変更後の所有グループを表示

## ファイルとアクセス権

ファイルは
* ファイルを所有するユーザ
* ファイル所有グループからファイル所有者を除いたユーザ
* その他のユーザ

この3つのレベルで権限を設定できる

### ファイルに設定できるアクセス
ファイルにはユーザで分けた3つのレベルごとに読み、書き、実行の3つの権限があり、
lsコマンドにlオプションを付けて表示される1つ目のカラムがファイルのモードを示している

#### d(ファイル種別) rwx(所有ユーザ) rwx(所有グループ) rwx(その他)

項目|内容
-|-
r|読み込み
w|書き込み
x|実行またはディレクトリ

rwxは、ユーザとグループとその他の3つに対して指定できる

~~~
$ ls -l .bashrc
-rw-r--r-- 1 penguin linux 124 2月 6 02:44 .bashrc
$ ls -l /usr
合計272
drwxr-xr-x   3 root root  4096  2月  6 01:45 X11R6
drwxr-xr-x   2 root root  4096  2月  8 13:07 arc
drwxr-xr-x   2 root root 69632  2月  9 04:02 bin
drwxr-xr-x   2 root root  4096  3月 30  2007 etc
drwxr-xr-x   2 root root  4096  3月 30  2007 games
drwxr-xr-x  84 root root 12288  2月  6 02:04 include
drwxr-xr-x   6 root root  4096 11月 11 11:39 kerberos
drwxr-xr-x 108 root root 69632  2月  7 11:41 lib
drwxr-xr-x  13 root root  4096  2月  9 04:02 libexec
drwxr-xr-x  11 root root  4096  2月  6 01:43 local
drwxr-xr-x   2 root root 16384  2月  7 11:41 sbin
drwxr-xr-x 226 root root 12288  2月  6 02:05 share
drwxr-xr-x   5 root root  4096  2月  6 08:52 src
lrwxrwxrwx   1 root root    10  2月  6 01:43 tmp -> ../var/tmp
~~~

2行目ではファイルのモードを示しており、所有者が読み書き,所有グループが読み,その他が読みとなっている

/usrディレクトリ以下のディレクトリは全てのユーザが読み込み可能で所有者(root)が書き込み可能となっている


### アクセス権の変更

ファイルのモードを所有ユーザ、所有グループとそれ以外のユーザについてファイルのアクセス権を設定する


#### chmod モード[,モード]... ディレクトリ

#### chmod モード[,モード]... ファイル

#### chmod ８進数表記のモード ディレクトリ

#### chmod ８進数表記のモード ファイル

このようにモード指定の書き方は次の2通りある

* モードの書式を複数書き、カンマで区切って指定
* 8進数3桁で各ユーザのレベルを指定


オプション|意味
-|-
-R|ディレクトリを対象に、ディレクトリの中のディレクトリを再帰的に（ディレクトリの中のディレクトリがあれば、中のディレクトリを全てたどって）変更する

### ファイルモードの変更
~~~
$ touch chownfile
$ chmod u+rw-x,go+r-wx chownfile
$ ls -l chownfile
-rw-r--r-- 1 penguin linuc 124 3月 27 19:09  chownfile
$ chmod g+w chownfile
$ ls -l chownfile
-rw-rw-r-- 1 penguin linuc 124 3月 27 19:09  chownfile
$ chmod u-r,o+w chownfile
$ ls -l chownfile
--wrw-rw- 1 penguin linuc 124 3月 27 19:09  chownfile
~~~

1行目でファイルを作成
2行目でファイルモードを「rw-r--r--」に変更
4行目でファイルモードを表示
5行目でグループにw(書き込み権限)を追加
7行目でファイルモードを表示
8行目でユーザからr(読み込み権限)を除去、その他にw(書き込み権限)を追加
9行目でファイルモードを表示

モード
* u(所有ユーザ)
* g(所有グループ)
* o(その他のユーザ)

に対して、r(読み)、w(書き)、x(実行またはディレクトリの変更)を

* 設定したり(=)
* 加えたり(+)
* 取り消したり(-)
* 全てに同じ権限を指定する(a)

たとえば
* -rw-r--r--をrw-rw-r--としたい場合は、グループのw(書き込み権限)を加えたいので**g+w**
* -rw-rw-r--を--w-rw-rw-としたい場合は、ユーザのr(読み込み権限)を取り除き、その他のw(書き込み権限)を加えたいので**u-r,o+w**

など



### ファイルモードを８進数で変更

~~~
$ touch chownfile
$ chmod u+rw-x,go+r-wx chownfile
$ ls -l chownfile
-rw-r--r-- 1 penguin linuc 124 3月 27 19:09  chownfile
$ chmod 664 chownfile
$ ls -l chownfile
-rw-rw-r-- 1 penguin linuc 124 3月 27 19:09 chownfile
$ chmod 266 chownfile
$ ls -l chownfile -w-rw-rw- 1 penguin linuc 124 3月 27 19:09  chownfile
$ chmod 277 chownfile
$ ls -l chownfile
--w-rwxrwx 1 penguin linuc 124 3月 27 19:09 chownfile
~~~

1行目でファイルを作成
2行目でファイルモードを「rw-r--r--」に変更
5行目でファイルモードを表示
6行目でファイルモードを664に変更
7行目でファイルモードを表示
8行目でファイルモードを266に変更
9行目でファイルモードを表示
10行目でファイルモードを277に変更
12行目でファイルモードを表示

![スクリーンショット 2021-10-19 0.05.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/e0721a86-cbe4-d419-3988-024a304af78e.png)


表を見ると、たとえば

* -rw-rw-r--としたい場合は8進数の664を指定(ユーザ=6、グループ=6、その他=4)
* --w-rw-rw-としたい場合は8進数の266を指定（ユーザ=2、グループ=2、その他=6）
* --w-rwxrwxとしたい場合は8進数の277を指定（ユーザ=2、グループ=7、その他=7）

**つまり合計値の部分を取り出して指定すればいい**


### モードの指定

#### setuidビットとsetgidビット

それぞれファイル所有者あるいは所有グループの権限で実行される
具体的に、rootユーザ所有でsetuidビットがセットされたプログラムは、一般ユーザが実行した場合でもrootユーザが実行した場合と同じ動作をする



#### sticky(スティッキー)ビット
これがその他のユーザについている場合、ディレクトリ内のファイルは所有者以外が削除できなくなる

Linuxでは、

* ファイルについてのスティッキービットは無視される
* 一般的に/tmpディレクトリにスティッキービットが付与されている


~~~
$ touch idbitfile
$ chmod u+rw-x,go+r-wx idbitfile
$ ls -l idbitfile
-rw-r--r-- 1 penguin linuc 03月 28 07:58  idbitfile
$ chmod u+s idbitfile
$ ls -l idbitfile
-rwSr--r-- 1 penguin linuc 03月 28 07:58  idbitfile
$ chmod u-s,g+s idbitfile
$ ls -l idbitfile
-rw-r-Sr-- 1 penguin linuc 03月 28 07:58  idbitfile
$ chmod +t idbitfile
$ ls -l idbitfile
-rw-r-Sr-T 1 penguin linuc 03月 28 07:58  idbitfile
~~~

1行目でファイルを作成
2行目でファイルモードを「rw-r--r--」に変更
4行目でファイルモードを表示
5行目でsetuidビットを追加
7行目でファイルモードを表示
8行目でsetuidビットを除去、setgidビットを追加
10行目でファイルモードを表示
11行目でsticky(スティッキー)ビットを追加
13行目でファイルモードを表示


### ファイル作成のモード

#### umask [８進数のモードのマスク]

ファイルを新規作成すると、644、もしくは664といったパーミッションが設定されてファイルが作成されるが、umaskコマンドを使うことで、指定したパーミッションでファイルを作成するように制限できる

umaskコマンドに続けてマスク値を指定しなかった場合は現在のマスク値を表示できる


### マスク値の変更

umaskコマンドで指定するマスク値は、すべてのユーザが読み書きできるパーミッション666から、設定したいパーミッションを引き算することでマスク値を求める

たとえば設定したいパーミッションが644なら

666 - 644 = 022

この**022**がマスク値ということ


~~~
$ umask -S
u=rwx,g=rx,o=rx
$ touch umask0022
$ umask -S u=rw,g=,o=rw
u=rw,g=,o=rw
$ touch umask 0070
$ ls -l umask00*
-rw-r--r-- 1 penguin linuc 03月 22 13:49 umask0022
-rw----rw- 1 penguin linuc 03月 22 13:50 umask0070
~~~

2行目で現在のマスク値を表示
3行目でファイルを作成
5行目でマスク値を070に変更
6行目でファイルを作成
9行目で作成したファイルのモードを確認
設定したパーミッションは644（666　-　022）と606（666　-　070）

-Sオプションを付けると、モードを表示または設定するとき、8進数ではなく意味がわかりやすい形式を使用できる

**umaskコマンドによるモードの制限は、umaskコマンドを実行したシェル内でしか有効ではない**

>参考書籍

>>『Linux標準教科書 v3.0.2』 LPI-Japan 2019年