13. Linuxのセキュリティ
13.1. Linuxサーバのセキュリティの基本
Linuxをサーバとして運用する場合はセキュリティの観点から主に以下の3点を考える必要がある。
- ユーザセキュリティの管理
- ホストレベルセキュリティの管理
- システムリソースの使用制限
13.1.1. ユーザセキュリティの管理
ユーザーパスワードは定期的に変更したり有効期限を設定することがセキュリティの観念から重要である。
13.1.2. ホストレベルセキュリティの管理
システムのポート情報、プロセス情報の確認がセキュリティの観念から重要である。 具体的には不要なポートが開いていないかどうかを確認する。
13.1.3. システムリソースの使用制限
1人のユーザーに大量のリソースを使用されないように、各ユーザーが使用できるプロセス数などのリソースを制限することが可能。
13.2. ユーザセキュリティの管理
13.2.1. パスワード管理に関するコマンド
chageコマンド
パスワードに有効期限を設定、パスワード変更の強制、アカウントの期限の設定が可能。 オプションを指定せずにchageコマンドを実行した場合は、対話モードで実行される。
オプション | 説明 |
---|---|
-l | パスワードまたはアカウントの有効期限を表示 |
-m | パスワード変更間隔の最低日数を設定 |
-M | パスワードの最大有効期限の日数を設定 |
-d | パスワードの最終更新日を設定 |
-W | パスワードの有効期限切れの警告が何日前から始まるかを設定 |
-I | パスワードの有効期限後、アカウントロックされるまでの日数を設定 |
-E | ユーザーアカウントが無効になる日付を設定 |
13.2.2. ログインの禁止設定
/etc/nologinファイル
このファイルの存在によりroot以外でのログインを禁止できる。
/bin/false,/sbin/nologinファイル
ログインさせない用に制御するためのシェルファイル。 ユーザーアカウントは必要であるがユーザがログインしてシェルを利用するのは好ましくないケースで使用する。
13.2.3. ユーザーの切り替え
普段は一般ユーザ、権限が必要なときだけrootでアクセスする。
suコマンド
一時的に別ユーザになるコマンド。
sudoコマンド
特定の管理者コマンドのみを実行するコマンド。
なお設定は/etc/sudoers
で設定、または/etc/sudoers.d/
ディレクトリ以下にファイルを追加することによる設定が可能。
なお直接ファイルを編集すのではなくvisudo
コマンドで設定を行う。
visudoコマンド
sudoコマンドを実行できるユーザに対するコマンドを定義できるコマンド。 書式は以下の通り。
13.2. ホストレベルセキュリティの管理
13.2.1. ホストへのアクセス
ホストのセキュリティを考える際以下点を注意することがセキュリティとして重要になる。
内部からのアクセスへの対策
- 適切なユーザーパスワード管理
- root権限で動作するプログラムを最小限にする
外部からのアクセスへの対策
- 必要なソフトウェアのみインストールする
- 不要なサービスを起動しない
- ホストレベルの適切なアクセス制御
- パケットフィルタリング
- セキュリティ情報の確認を頻繁にする
13.2.2. スーパサーバの設定と管理
スーパサーバ
スーパーサーバは他のサーバプログラムに変わってサービス要求を監視して、接続確立時に本来のサーバプログラムに要求を引き渡すシステム。 これにより必要時に個々のサーバプログラムを起動することでリソースを効率的に使用することが可能。 またTCPラッパーと組み合わせることで、アクセス制御を集中管理できる。
FTPやsshサーバなどの接続頻度の高くないサーバに向いている。
スーパサーバの種類
スーパサーバにはinetd、xinetdがあり、xinetdが多くのディストリビューションで採用されている。
https://www.infraexpert.com/infra/study10.html https://wand-ta.hatenablog.com/archive/category/LPIC
xinetdの設定
全体の設定は/etc/xinetd.conf
、サービスごとの設定は/etc/xinetd.d/
以下で設定可能。
全体設定のファイル(/etc/xinetd.conf
)
defaults
{
instances = 60 # 各サービスにおける最大デーモン数
log_type = SYSLOG authpriv # ログの出力方法
log_on_success = HOST PID # 接続許可時にログに記録する内容
log_on_failure = HOST # 接続拒否時にログに記録する内容
cps = 25 30 # 1秒間に接続可能な最大コネクション数 ・ 限度に達した時のサービス休止の秒数
}
includedir /etc/xinetd.d # 各サービスごとの設定ファイルを格納するディレクトリ
なお設定後は/etc/init.d/xinetd restart
で再起動が必要。
inetdの設定
全体の設定は/etc/inetd.conf
、サービスごとの設定は/etc/inetd.d/
以下で設定可能。
inetdは現在はほとんど使用されていない。
13.2.3. TCP Wrapper
TCP Wrapperはセキュリティソフトウェアで、通信で使用するTCPポートを把握していて、アクセス制御を行ったり、通信ログを保存することが可能。
具体的には外部からアクセスしてくるポートの細かい制限を行うことができる。 設定は以下2ファイルを用いて行う。
設定ファイル | 説明 |
---|---|
/etc/hosts.allow | アクセス制御の許可設定を行うファイル |
/etc/hosts.deny | アクセス制御の拒否設定を行うファイル |
書式は以下形式で記述する。
13.4. システムリソースの使用制限
13.4.1. システムリソースの制限を行うコマンド
ulimitコマンド
ユーザが利用できるリソースを制限するコマンド。 1人のユーザが全てを使い切り、システムが停止する可能性を制限する。
オプション | 意味 |
---|---|
-a | 制限の設定値をすべて表示 |
-c サイズ | 生成されるコアファイルのサイズを指定 |
-f サイズ | シェルが生成できるファイルの最大サイズ |
-n 数 | 同時に開くことのできるファイルの最大数 |
-u プロセス数 | 1人のユーザが利用できる最大プロセス数 |
-v サイズ | シェルとその子プロセスが利用できる最大仮想メモリサイズを指定する |
13.5. SSHの設定
13.5.1. SSH
SSHの基礎
SSHはネットワークに接続した機器を遠隔操作するために使用するL7層のプロトコル。
sshコマンド
ssh接続を行うコマンド。telnetより安全性が高い。
オプション | 説明 |
---|---|
-1 | SSHプロトコルバージョン 1 を使用 |
-2 | SSHプロトコルバージョン 2 を使用 |
-l ユーザ名 | ログインユーザー名を指定 |
-p ポート番号 | リモートホスト接続時に使用するポート番号を指定 |
-i 秘密鍵ファイル | 秘密鍵の指定 |
-o StrictHostKeyChecking=no | ホストキーの検証回避 |
ユーザーがログインしてシェルあるいはコマンドを実行する直前にSSHは、/etc/sshrc
ファイルに記述されているコマンドを実行する。
SSHでの接続時にはログイン時と同様、全ユーザー共通の設定ファイル(/etc/sshrc
)とユーザー毎に読み込まれる設定ファイル(~/.ssh/.config
)が読み込まれる。
scpコマンド
SSHの仕組みでホスト間で安全にファイルをやりとりするコマンド。
オプション | 説明 |
---|---|
-i 鍵ファイル | ssh接続に使用する鍵ファイルを指定する |
-P ポート番号 | (sshのポートを変更している場合などに)接続に使用するポートを指定する |
-p | コピー元のタイムスタンプやパーミッションを保持する |
-r | ディレクトリごと再帰的にコピーする |
13.5.2. SSH鍵の生成
ssh-keygenコマンド
SSHで公開鍵と秘密鍵のペアを作成するコマンド。 一般的には暗号化にはRSAを使用したほうが良い。
オプション | 説明 |
---|---|
-p | 既存の秘密鍵ファイルのパスフレーズを変更 |
-t | 生成する鍵の種類( rsa1 または rsa または dsa )を指定 |
-b | 鍵の長さを指定(2048など) |
RSA暗号方式の鍵を生成した場合、秘密鍵と公開鍵は次のファイルパスに生成する。
また、生成した公開鍵は、~/.ssh/authorized_keys
に公開鍵リストとして追加される。
鍵 | 説明 |
---|---|
秘密鍵 | ~/.ssh/id_rsa |
公開鍵 | ~/.ssh/id_rsa.pub |
13.5.3. SSHのホストベース認証
ホストベース認証はSSHサーバに登録済みのホストからSSH通信があった場合にそのユーザーを信用して接続を許可する認証。 サーバの正当性確認するものとなっている。 このとき、SSHサーバとクライアントはユーザー認証を行わずホストの認証のみを行う。
認証手順は以下の通り。
- サーバの公開鍵をクライアントに送る
- クライアント側で保存されているサーバの公開鍵(場所は
~/.ssh/known_hosts
)と一致確認 - またホストベース認証の鍵のファイルパスは以下に配置される。
暗号化方式 | 鍵 | 鍵のファイルパス |
---|---|---|
RSA | 秘密鍵 | /etc/ssh_host_rsa_key |
RSA | 公開鍵 | /etc/ssh_host_rsa_key.pub |
13.5.4. 公開鍵認証
公開鍵認証はユーザ認証の方式の1つ。 認証フローは以下の通り。
- クライアント側で鍵ペア作る(
ssh-keygen
) - クライアントの公開鍵をホストに渡す
- クライアントの鍵が使用できるか確認する
- クライアントの秘密鍵で署名を作る
- サーバに送る
- サーバ側の、クライアント公開鍵で署名を検証する
13.5.5. SSH Agent
SSH Agentは秘密鍵ファイルを使用する際にパスワード認証なしにログインすることができる仕組み。 秘密鍵をメモリ上に保存しておいて必要時に利用するようにすることで実現している。
利用は以下のように行う。
- ssh-agentの子プロセスとしてbashシェルの起動(
ssh-agent bash
) ssh-add
コマンドを使用して秘密鍵を登録
13.5.6. OpenSSH
OpenSSHは高いセキュリティでリモートホスト間通信できる仕組み。 SSH v1系、v2系両対応しており、ファイル転送、リモート操作が可能。
認証機能と暗号化が含まれる。
OpenSSHのインストール
インストールする際のパッケージは以下表の通り。
また設定ファイルは/etc/sshd_config
となる。
client | server | |
---|---|---|
Ubuntu, Debian | openssh-client | openssh-server |
Ret Hat系 | openssh, openssh-client | openssh-server |
サーバの起動はSysVinitのRedHat系で/etc/init.d/sshd start
、Debian系で/etc/init.d/ssh start
となる。
またSystemdではsystemctl start sshd.service
となる。
13.5.7. GnuPG
GPG(GnuPG)はファイルの暗号化と復号が行えるOSSソフトウェア。 公開鍵暗号を使用してファイルの暗号化と復号、電子署名することが可能。
GnuPGを使用するためにはgpg
コマンドを使用する。