デスクトップOSは、ほぼ自分専用で利用するためユーザ管理はほとんど意識しませんが、サーバOSは複数のユーザが利用します
Linuxで「複数のユーザを管理する仕組み」と「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コマンドを実行するユーザ」が所有者である必要があります