Linux覚え書きユーザ管理

# 概要
Linux学習で覚えたコマンドや知識をメモする記事です。
コマンドは[Linux覚え書きコマンド集](https://qiita.com/Momomo_ai/items/8bd7da1cf95b34e4c026)にまとめています


# ユーザ管理
グループとユーザを適切に管理することで、ファイルやプログラムなどを必要なユーザのみ参照・編集する権限を与えることが出来ます。
グループやユーザの編集を行う場合は、管理者であるrootユーザで実行する必要があります。

```
# で始まる場合はroot権限
$ で始まる場合は一般ユーザ
```
## ユーザ

ユーザは**/etc/passwd**に定義されている。基本はコマンドで編集する。
### パスワードファイルの内容
```:/etc/passwd
account:password:UID:GID:GECOS:directory:shell
```
| 項目 | 内容
|:----|:----
| account | ユーザ名(大文字は含めない)
| password | パスワード（'x'で表示される)
| UID | ユーザID番号
| GID | プライマリグループID
| GECOS | ユーザ名またはコメント
| directory | ホームディレクトリ
| shell | ログイン時に起動されるコマンドインタプリタ

### ユーザを追加
```
useradd ユーザ名
```
<オプション>

| オプション | 説明 |
|:-----|:----|
| -c [コメント] | コメント追加
| -g [グループ名]| プライマリグループを指定
|-G [グループ名]| 補助グループを指定
| -d | ホームディレクトリを指定
| -s | シェルを指定(デフォルト /bin/bash)
| -u | ユーザID |

### ユーザの変更
```
 usermod ユーザ名
```
<オプション>

| オプション | 説明 |
|:-----|:----|
| -c [コメント] | コメント追加
| -g [グループ名]| プライマリグループを指定
|-G [グループ名]| 補助グループを指定
| -l [ユーザ名] | ユーザ名を変更する
| -u [ユーザID] | ユーザIDを変更

### ユーザの削除
```
 userdel ユーザ名
```
<オプション>

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

## グループ



### グループファイルの内容
```:/etc/group
group_name:password:GID:user_list
```
| 項目 | 内容
|:----|:----
| group_name| グループの名前
| password | パスワードが不要なら空欄
| GID | グループID
| GECOS | ユーザ名またはコメント
| user_list| グループに所属するユーザ




ユーザは**/etc/group**に定義されている。基本はコマンドで編集する。
### グループの作成
```
groupadd グループ名
```
<オプション>

| オプション | 説明 |
|:-----|:----|
| -g [グループID]|グループIDを指定 
### グループ情報の変更
```
groupmod [-g gid] [-n new-group-name] 変更対象のグループ
```
<オプション>

| オプション | 説明 |
|:-----|:----|
| -n | 既存グループ名の変更をする場合に指定
| -g | 既存グループIDを変更
### グループ情報の削除
```
groupdel グループ名
```

## パスワード
ユーザを利用するにはパスワードが必要。パスワードは**/etc/shadow**に暗号化されて記録される。

```
passwd [ユーザ名]
```

### シャドウファイル
```
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からアカウントが使用不能になる日までの日数
| reserved| 予約フィールド

## 特殊なユーザ
### 一般ユーザ
アカウントを作成すると、ユーザ名と同じのグループが作られ、ユーザはそのユーザグループに所属します。
グループを利用することで以下のようなことが行えます。
+ ある特定のディレクトリにアクセスできるグループの作成
+ 特定グループに所属しているユーザのみrootユーザになることができる運用

### rootユーザ
rootユーザはシステムの変更やプログラムのインストール、ユーザ作成などが行える（利用制限のないユーザ）です。

### su コマンド
別ユーザでログインしているユーザが、一時的に他のユーザになる為のコマンド。
ユーザを指定しない場合はrootユーザでシェルを起動する。

オプションなしで実行した場合、カレントディレクトリを変更しないでログインします。
rootの帆無ディレクトリに変更したい場合は、以下のように実行する
 + `su -`
 + `su -root`

su コマンドを利用することでrootユーザで作業を開始した時間などが履歴に残るため、管理面を考える

### sudoコマンド
sudoコマンドを利用することで、rootユーザでコマンドを実行することができる。
su コマンドはユーザを切り替えるが、sudoコマンドは切り替えることなく実行が可能。

```
sudo コマンド
```
| オプション | 説明 |
|:-----|:----|
| -u [ユーザ名]| 指定したユーザでコマンドを実行 


## 用途別
### 一般ユーザにsudo権限を付与

以下の方法で、特定のユーザをwheelグループに追加し、sudoコマンドを実行時にPWの入力を不要とする。

```bash
su   # rootに変更
usermod -G wheel <username> # wheelグループに<username>を追加
vigr     # wheelグループにユーザが追加されているか確認
visudo   # wheelグループを有効に変更（%wheel ALL=(ALL) NOPASSWD: ALL)
```
# アクセス権
ユーザとグループを変更する場合は、rootユーザで実行する必要がある。

ファイルは以下の3つの権限レベルが存在する

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

権限レベルごとに 読み・書き・実行の権限が存在する

それぞれの権限を確認するには以下のコマンドを実行する

```bash
ls -l 

#d rwxrwxrwx <所有者><所有グループ><バイトサイズ><更新日><ファイル名>　# ユーザ , グループ, その他
```

|項目| 説明 |
|:-----|:----|
| r |読み込み
| w |書き込み
| x |実行またはディレクトリの移動

8進数表記は、付与したい権限を合計する

|項目| 数値 |
|:-----|:----|
| r |4
| w |2
| x |1

## chmod :アクセス権の変更
```
chmod モード[, モード]... ディレクトリ/ファイル
chmod 8進数表記のモード ディレクトリ/ファイル
```

## chown :所有者の変更
```
chown ユーザ[. グループ] ディレクトリorファイル
```

| オプション | 説明 |
|:-----|:----|
| -R |ディレクトリの中のファイルも再帰的に変更する

## chgrp :所有グループの変更
```
chgrp グループ ディレクトリ
```
| オプション | 説明 |
|:-----|:----|
| -R |ディレクトリの中のファイルも再帰的に変更する

## 特殊な属性(setuid, setgid, sticky)

**setuid/setgid** 付与されていると所有者/所有グループの権限で実行される

例） 一般ユーザがrootユーザ所有のsetuidがセットされたプログラムを実行
　→ rootユーザが実行した場合と同じ動作になる

**sticky**が付与されたディレクトリ内のファイルは所有者以外削除できなくなる
一般的には/tempディレクトリに付与される

## 作成時のデフォルト

CentS7は/etc/login.defsに記載されている

umaskを利用することで、デフォルトのモードから変更してファイルを作成出来る

```
umask [8進数のモードのマスク値]
```