Linuxの基本(その4)「ユーザ・グループ」とパーミッション

デスクトップOSは、ほぼ自分専用で利用するためユーザ管理はほとんど意識しませんが、サーバOSは複数のユーザが利用します
Linuxで「複数のユーザを管理する仕組み」と「SSHで遠隔サーバーにログインする方法」をざっくりまとめました

目次
  1. ユーザ管理
    1. ユーザ情報
    2. 新規ユーザ作成・変更・削除
  2. グループの管理
    1. グループ情報
    2. グループ作成・変更・削除
  3. パーミッションの確認
    1. 所有者・パーミッションの変更
  4. SSHによるサーバーへのリモートログイン

ユーザ管理

Linuxでは、ユーザアカウントにログインしてシステムを利用します
また、ユーザには必ず1つ以上のグループが設定されます

内部では「ユーザID(uid)」「グループID(gid)」に対して、「ファイル」へのアクセス権限(パーミッション)が付与されます

ユーザ情報

ユーザアカウントの種類

rootユーザ
管理者権限を持っている特別なユーザで、システムのすべてに無制限にアクセスできます(システム管理者)
「uid」は「0」です
システムユーザ
バックグラウンドで動くサービス専用のユーザです
「uid 」は「 1から499(999) 」です(*ディストリビューションで異なります)
一般ユーザ
システムを利用するユーザで、できることに制限があります
システム内部で「ユーザID(uid)」と所属グループ「グループID(gid)」という値で管理されます
*ユーザは複数のグループに所属することができます

ログイン後、idコマンドでログインユーザ情報を確認

id
uid=501(ユーザ名) gid=20(主グループ名) groups=20(サブグループ名) ...

su -でrootユーザになりidコマンドで情報を確認
*suコマンドは、ユーザを変更するコマンド
ユーザ名を指定せずに実行するとrootユーザに変更、引数に「-」を付けると、環境変数を再設定します

id
uid=0(root) gid=0(root) groups=0(root)
id [オプション] [ユーザ名]
ユーザIDやユーザ名、グループIDやグループ名などを表示
-u : ユーザのIDを表示
-g:グループのIDを表示
-G:ユーザが所属する全てのグループをIDで表示
-n:「-u、-g、-G」といっしょに使用して、ユーザやグループの名前だけを表示
su [オプション] [ユーザ]
他のユーザに切り替えるコマンド
exitで元のユーザに戻ります
su -c コマンド指定したコマンドだけをroot権限で実行(sudoコマンドと同じですが、sudoコマンドではユーザのパスワードで実行、suコマンドではrootユーザのパスワードが必要です)
コマンドにオプションがあるときは""(引用符)で囲みます
-, -l : 現在のシェルの環境変数は解除して指定したユーザのシェルを起動、カレントディレクトリがホームディレクトリになります

*シェルの詳細は次回へ

ユーザの一覧を確認する

「/etc/passwd」ファイルに
「ユーザ名」:「パスワード」:「ユーザID」:「グループI」:「コメント」:「ホームディレクトリ」:「ログインシェル」の順にユーザ情報が記録されています
*「パスワード」は暗号化され「 x 」で表示されます(「x」はシャドウパスワードを意味します)
*「ログインシェル」はログインした時に起動するシェルです

cut -d: -f1 /etc/passwd

ユーザのシャドウパスワードを確認

パスワードは「/etc/shadow」ファイルに(rootユーザのみ読み取れるシャドウファイル)暗号化して格納しています

grep ユーザ名 /etc/shadow

新規ユーザ作成・変更・削除

一般ユーザを作成するときは、必要に応じてpasswdコマンドで初期パスワードを設定します

useradd [オプション] ユーザ名
新規に一般ユーザを作成します
-Dデフォルトの設定値を確認
-u uid : ユーザ IDを指定
-d ホームディレクトリ: ホームディレクトリを指定
–g gid(またはグループ名): 主グループ名または主グループIDを指定
–G gid(またはグループ名): サブグループを指定(複数指定は「,」で区切る)
–s シェル : ログイ ンシェルを指定
-c コメント: コメントを入れる
-e YYYY-MM-DD : アカウントが無効になる年月日を指定
-f 日数 : パスワード使用期限が切れてから、日数経過すると使用不能となります
「-1 」を指定するとこの機能は無効になります(デフォルト値は「-1」)
-D [オプション][オプション値] : デフォルト値を変更
passwd [オプション] [ユーザ名]
パスワードを変更するためのコマンド
rootユーザはpasswd ユーザ名で指定したユーザのパスワードを変更
*一般ユーザはpasswdのみで自身のパスワードを変更
-x 日数 : パスワードの有効期限を設定
-x 日数 -w 日数 : パスワードの有効期限と、変更までの猶予期間を設定
-l ユーザ名 : ユーザをロック
-u ユーザ名 : ユーザのロックを解除
-d ユーザ名 : パスワードを削除
--stdin : 新しいパスワードを標準入力から読み込む
usermod [オプション] ユーザ名
ユーザの設定値やパスワードの変更・ユーザのロック/アンロックや有効日などの設定ができます
-l 新ログイン名 : ログイン名の変更
-p パスワード : 新たなパスワードを指定
-L : ユーザのパスワードをロックする
-U : ユーザのパスワードをアンロックする
userdel [オプション] ユーザ名
ユーザを削除します(削除するユーザだけが所属していたグループも同時に削除されます)
-r : ホームディレクトリとメールスプールも同時に削除

余談「adduserコマンド」について
「adduserコマンド」もユーザ作成するためのコマンドです
Debian系ディストリビューションでは、 やり取りしながら設定するようです(パスワードもここで聞かれて設定)

グループの管理

ユーザにグループを割当ることで、グループ単位で権限の管理ができます
一人のユーザが複数のグループに所属する事も可能です
たとえば、「特定のディレクトリへのアクセス」「ファイルの読み書き」を制限したいときは「パーミッション」という機能を使って管理できます

グループ情報

groupsコマンドで所属するグループを確認

groups
主グループ サブグループ1 ・・・・

グループ一覧を確認する

「/etc/group」ファイルに
「グループ名」:「グループのパスワード」:「グループID」:「サブグループとして所属しているアカウントのリスト」の順に記録されています
*「パスワード」は暗号化され「 x 」で表示されます(「x」はシャドウパスワードを意味します)
*「サブグループ」とは、ユーザが最初に所属するグループ「主グループ(プライマリグループ)」以外で登録しているグループです
ちなみに、「プライマリグループ」はユーザ名と同じグループ名で登録していることが多い(ユーザは必ずどこかのグループに登録が必要)

cut -d: -f1 /etc/group

グループのログイン・パスワードについて

  • 「ファイルやディレクトリ」を作成すれば、「そのファイルやディレクトリ」はログインしたグループの所有物になります
  • 「プライマリグループ」は、ログインしたグループへ変更されます
  • サブグループへのログインは、パスワードなしでログインできます
  • 所属していないグループへのログインはパスワードが必要です(そもそもパスワードが設定されていないグループにはログインできません)
  • newgrp グループ名 (newgrpコマンドを使用しグループにログイン)
  • gpasswd グループ名(gpasswdコマンドでグループのパスワードを設定)
  • グループのパスワードは「/etc/gshadow 」に暗号化され保存されています

グループ作成・変更・削除

groupadd [オプション] グループ名
グループを追加します
-g gid : グループIDを指定(指定しなかったときは、自動で付く)
-p パスワード: パスワード付きのグループ
groupmod [オプション] グループ名
グループIDや名前を変更する
-n グループ名 : 指定したグループ名に名前を変更
-g グループID : 指定したグループIDに変更
-p パスワード: パスワード付きのグループに変更
groupdel [オプション] グループ名
グループを削除します
-f: 既存ユーザのプライマリグループでも削除

ユーザをサブグループに所属させるとき

usermod -G サブグループ名 ユーザ名

パーミッションの確認

パーミッションとは、「ファイルやディレクトリ」に関する権限のことで、3種類の権限があります

  • 読み取り権限
  • 書き込み権限
  • 実行権限

権限が与えられたユーザやグループのみが、その機能を使用できます

「ファイルやディレクトリ」のパーミッションを確認するには、ls -l で「ファイルやディレクトリ」の詳細を表示します(隠しファイルも表示する場合はls -la

ファイルやディレクトリ情報の詳細

所有者と所有グループについて

「ファイルやディレクトリ」を作成すると、「作成したユーザがファイルの所有者」「作成したアカウントのプライマリグループが所有グループ」になります

ファイルタイプについて

  • 「-」は、ファイル
  • 「d」は、ディレクトリ
  • 「l」は、シンボリックリンク

アクセル権限(パーミッション)について

記号権限数字
r読み込み可能4
w書き込み可能2
x実行可能1
権限がない0

(注意)実行権限がないディレクトリに移動はできません

所有者・パーミッションの変更

chown [オプション] 新しい所有者 ファイル名
ファイルの所有者と所有グループを変更
-R: ディレクトリの中身も再帰的に変更
chgrp [オプション] 新しい所有グループ ファイル名
ファイルの所有グループを変更
-R: ディレクトリの中身も再帰的に変更
chmod [オプション] モード ファイル名
パーミッションを変更
-R: ディレクトリの中身も再帰的に変更
-v: 実行結果を表示
*モードについては下記を参照

モードについて
パーミションの設定には、2通りあります

  • 「u, g, o, a」のどれかに「+,-,=」を設定する方法
  • 数値で設定する方法

「u, g, o, a」のどれかに「+,-,=」を設定する方法
例えば chmod g+w file.txtは、file.txtの所有グループに書き込み権限を追加します

u所有者
g所有グループ
o所有者でもなく、所有グループでもないその他
a全て
*省略しても「a」を指定したことになります
+あとに記述した権限を追加する
あとに記述した権限を削除する
=あとに記述した権限にする

数値で設定する方法
例えば、chmod 777 file.txtは、所有者、所有グループ、その他にすべての権限を付与します

スティッキービットを設定するには、通常のパーミッション数値に1000を足す(例えば、chmod 1777)またはchmod +t です
スティッキービットが設定されたディレクトリは、所有者とrootユーザ以外はファイルの改名や削除ができません
パーミッション情報のフラグに「t」という文字がつきます

SSHによるサーバーへのリモートログイン

「SSH」とは、遠隔にあるサーバーを操作するための、クライアントとサーバーの通信を暗号化するプロトコルです

「OpenSSH」について

「OpenSSH」は、SSHプロトコルを利用するためのオープンソースソフトウェアで「SSHサーバー」「SSHクライアント」の両方を提供するLinuxの必須アプリケーションです(FTPのようにファイルのやりとりを行う「sftp」や「scp」などのツールも含まれています)
*サーバー側を自分で準備する場合、はセキュリティを考慮して「rootでのSSHログインを禁止」「ポート番号を変更」「パスワード認証を禁止」などの初期設定が必要です

Ubuntuでは、sshdプログラムは含まれていません
「OpenSSH」をapt install openssh-serverでインストールします

「 /etc/ssh/sshd_config」が設定ファイルです

余談「SSHクライアント」には、Windows対応の「Tera Term」「PuTTY」や、Macの「ターミナル(OpenSSH)」などがあります

SSHのログイン認証方法は、2つあります

  • パスワード認証は、「ユーザ名とパスワード(サーバーに登録ずみ)」でログイン認証を行います
    通常インターネットに接続するサーバーでは使用しません
  • 公開鍵認証は、鍵を持った人のみがログインできる仕組みでパスワード認証より安全な認証です

公開鍵認証について
あらかじめ公開鍵と秘密鍵のペアを作り、公開鍵はサーバー側に、秘密鍵はクライアンと側に保管します
公開鍵は簡単に入手できる公開された鍵で、秘密鍵は1つだけの重要な鍵です
秘密鍵を持っている人だけがログインできます

公開鍵認証

公開鍵認証の準備は、2通りです

  • サーバー側で公開鍵認証用鍵ペアの生成し、クライアントPCに秘密鍵をダウンロードして保存する(既存のサーバーにログインする場合は、ぼぼこちら)
  • クライアント側で公開鍵認証用鍵ペアを生成し、サーバーに公開鍵を転送する(自分でサーバーを準備する場合)

サーバー側で公開鍵認証用鍵ペアの生成した場合の、SSHログイン
*コマンドの詳細は別途

#秘密鍵はPCにダウンロード済み
#パーミッションの変更
chmod 600 秘密鍵のファイルのPATH
# SSHでログイン
ssh -i 秘密鍵のファイルのPATH ユーザ名@ホスト名またはIPアドレス

クライアント側で公開鍵認証用鍵ペアを生成した場合の、SSHログイン
サーバー上のユーザのホームディレクトリに「~/.ssh/authorized_keys」を作り、秘密鍵(id_rsa)をコピーします
*コマンドの詳細は別途

#公開鍵・秘密鍵の生成
ssh-keygen
# ~/.sshディレクトリに作成された公開鍵(id_rsa.pub)と秘密鍵 (id_rsa) を確認
ls ~/.ssh
# サーバーへSSH(パスワード認証)でログイン
ssh ユーザ名@ホスト名またはIPアドレス
# .sshディレクトリを作成
mkdir .ssh
# パーミッションの変更
chmod 700 .ssh
# ログアウト
exit
# サーバーへの公開鍵の設置(ユーザのホームディレクトリコピー)
scp ~/.ssh/id_rsa.pub ユーザ名@接続先:~/.ssh/authorized_keys
# 公開鍵認証でログインできることを確認(接続成功したら、パスワード認証による接続を禁止します)
ssh -i ~/.ssh/id_rsa ユーザ名@ホスト名またはIPアドレス

SSHコマンド

ssh [オプション] ホスト名またはIPアドレス [コマンド]
リモートにSSHでログインしコマンドを実行します
-i 秘密鍵ファイル : 秘密鍵ファイルを指定します
-l ユーザ名 : ログインユーザ名を指定 または ssh ユーザ名@ホスト名またはIPアドレス
-p ポート番号 : ポート番号を指定
ssh-keygen [オプション]
公開鍵と秘密鍵を作成するコマンド
公開鍵の作成はssh-keygenのみで作成できます(対話形式で鍵の設置場所パスフレーズの入力が求められます「設置場所のデフォルトはユーザのホームディレクトリにある.ssh ディレクトリ」)
-t 方式 : 作成する鍵の暗号化形式を「rsa(デフォルト)」「dsa」「ecdsa」「ed25519」から指定する
-f ファイル名 : ファイル名を指定する(例: -f id_rsa_hoge)
-p : パスフレーズの変更(対話形式)
*パスフレーズは、秘密鍵を有効にするためのパスワードのようなものです(秘密鍵を盗まれたとしても、パスフレーズが分からなければSSHで接続することはできません)
scp [オプション] コピー元 ユーザ名@IPアドレス:ファイルのPATH
SSHを利用してファイルをコピーするコマンドです
*リモートのファイルを自分のPCにコピーする場合は、コピー元ファイル名にユーザ名とIPアドレスを付ける(コピー先は例えば「./」)
-C : 圧縮します
-i 秘密鍵ファイル : 秘密鍵ファイルを指定します
-P ポート番号 : ポート番号を指定
-r : ディレクトリの中身をすべて再帰的に転送します
sftp
SSHで対話的なファイル転送を行います
sftp ユーザ名@接続先でログインします
get ファイルPATH : リモートからローカルへファイルを取得します
put ファイルPATH : ローカルからリモートへファイルを転送します

「.ssh 」ディレクトリについて

サーバーへはじめて接続するときは、接続確認され「yes」と答えると、 クライアントのホームディレクトリに「.ssh 」ディレクトリが作成され、その中の「 known_hostsファイル」にSSHサーバ証明書が保存されます(「~/.ssh/known_hosts」)
2回目からは、送られてきたSSHサーバ証明書と保存してあるSSHサーバ証明書を比較して「なりすまし」を防止します

ssh-keygenコマンド実行時には、「.ssh 」ディレクトリに公開鍵(id_rsa.pub)と秘密鍵 (id_rsa)が作成されます

「.ssh ディレクトリ」と「公開鍵・秘密鍵」のパーミッションについて

ssh-keygenコマンドで「公開鍵・秘密鍵」を作成したときは、パーミッションは設定されています
しかし、鍵をコピーしたときは自分でパーミッションを設定します
設定するパーミッションは「.ssh ディレクトリは、700」「id_rsa.pub(公開鍵)は、644」「id_rsa(秘密鍵)は、600」です
「sshコマンドを実行するユーザ」が所有者である必要があります