コンテンツにスキップ

13. Linuxのセキュリティ

13.1. Linuxサーバのセキュリティの基本

Linuxをサーバとして運用する場合はセキュリティの観点から主に以下の3点を考える必要がある。

  1. ユーザセキュリティの管理
  2. ホストレベルセキュリティの管理
  3. システムリソースの使用制限

13.1.1. ユーザセキュリティの管理

ユーザーパスワードは定期的に変更したり有効期限を設定することがセキュリティの観念から重要である。

13.1.2. ホストレベルセキュリティの管理

システムのポート情報、プロセス情報の確認がセキュリティの観念から重要である。 具体的には不要なポートが開いていないかどうかを確認する。

13.1.3. システムリソースの使用制限

1人のユーザーに大量のリソースを使用されないように、各ユーザーが使用できるプロセス数などのリソースを制限することが可能。

13.2. ユーザセキュリティの管理

13.2.1. パスワード管理に関するコマンド

chageコマンド

パスワードに有効期限を設定、パスワード変更の強制、アカウントの期限の設定が可能。 オプションを指定せずにchageコマンドを実行した場合は、対話モードで実行される。

chage < オプション > < ユーザー名 >
オプション 説明
-l パスワードまたはアカウントの有効期限を表示
-m パスワード変更間隔の最低日数を設定
-M パスワードの最大有効期限の日数を設定
-d パスワードの最終更新日を設定
-W パスワードの有効期限切れの警告が何日前から始まるかを設定
-I パスワードの有効期限後、アカウントロックされるまでの日数を設定
-E ユーザーアカウントが無効になる日付を設定

13.2.2. ログインの禁止設定

/etc/nologinファイル

このファイルの存在によりroot以外でのログインを禁止できる

/bin/false,/sbin/nologinファイル

ログインさせない用に制御するためのシェルファイル。 ユーザーアカウントは必要であるがユーザがログインしてシェルを利用するのは好ましくないケースで使用する。

13.2.3. ユーザーの切り替え

普段は一般ユーザ、権限が必要なときだけrootでアクセスする。

suコマンド

一時的に別ユーザになるコマンド。

su - hogehoge

sudoコマンド

特定の管理者コマンドのみを実行するコマンド。

sudo <コマンド>

なお設定は/etc/sudoersで設定、または/etc/sudoers.d/ディレクトリ以下にファイルを追加することによる設定が可能。 なお直接ファイルを編集すのではなくvisudoコマンドで設定を行う。

visudoコマンド

sudoコマンドを実行できるユーザに対するコマンドを定義できるコマンド。 書式は以下の通り。

ユーザー名 ホスト名=(実行ユーザー名) コマンド

13.2. ホストレベルセキュリティの管理

13.2.1. ホストへのアクセス

ホストのセキュリティを考える際以下点を注意することがセキュリティとして重要になる。

内部からのアクセスへの対策

  • 適切なユーザーパスワード管理
  • root権限で動作するプログラムを最小限にする

外部からのアクセスへの対策

  • 必要なソフトウェアのみインストールする
  • 不要なサービスを起動しない
  • ホストレベルの適切なアクセス制御
  • パケットフィルタリング
  • セキュリティ情報の確認を頻繁にする

13.2.2. スーパサーバの設定と管理

スーパサーバ

スーパーサーバは他のサーバプログラムに変わってサービス要求を監視して、接続確立時に本来のサーバプログラムに要求を引き渡すシステム。 これにより必要時に個々のサーバプログラムを起動することでリソースを効率的に使用することが可能。 またTCPラッパーと組み合わせることで、アクセス制御を集中管理できる。

FTPやsshサーバなどの接続頻度の高くないサーバに向いている。

スーパサーバの種類

スーパサーバにはinetdxinetdがあり、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 アクセス制御の拒否設定を行うファイル

書式は以下形式で記述する。

デーモン名  ホスト名またはIPアドレス

13.4. システムリソースの使用制限

13.4.1. システムリソースの制限を行うコマンド

ulimitコマンド

ユーザが利用できるリソースを制限するコマンド。 1人のユーザが全てを使い切り、システムが停止する可能性を制限する。

ulimit <オプション>
オプション 意味
-a 制限の設定値をすべて表示
-c サイズ 生成されるコアファイルのサイズを指定
-f サイズ シェルが生成できるファイルの最大サイズ
-n 数 同時に開くことのできるファイルの最大数
-u プロセス数 1人のユーザが利用できる最大プロセス数
-v サイズ シェルとその子プロセスが利用できる最大仮想メモリサイズを指定する

13.5. SSHの設定

13.5.1. SSH

SSHの基礎

SSHはネットワークに接続した機器を遠隔操作するために使用するL7層のプロトコル。

sshコマンド

ssh接続を行うコマンド。telnetより安全性が高い。

ssh <オプション> <接続先ホスト>
オプション 説明
-1 SSHプロトコルバージョン 1 を使用
-2 SSHプロトコルバージョン 2 を使用
-l ユーザ名 ログインユーザー名を指定
-p ポート番号 リモートホスト接続時に使用するポート番号を指定
-i 秘密鍵ファイル 秘密鍵の指定
-o StrictHostKeyChecking=no ホストキーの検証回避

ユーザーがログインしてシェルあるいはコマンドを実行する直前にSSHは、/etc/sshrcファイルに記述されているコマンドを実行する。

SSHでの接続時にはログイン時と同様、全ユーザー共通の設定ファイル(/etc/sshrc)とユーザー毎に読み込まれる設定ファイル(~/.ssh/.config)が読み込まれる。

scpコマンド

SSHの仕組みでホスト間で安全にファイルをやりとりするコマンド。

scp <オプション> コピー元パス 保存先パス
オプション 説明
-i 鍵ファイル ssh接続に使用する鍵ファイルを指定する
-P ポート番号 (sshのポートを変更している場合などに)接続に使用するポートを指定する
-p コピー元のタイムスタンプやパーミッションを保持する
-r ディレクトリごと再帰的にコピーする

13.5.2. SSH鍵の生成

ssh-keygenコマンド

SSHで公開鍵と秘密鍵のペアを作成するコマンド。 一般的には暗号化にはRSAを使用したほうが良い。

ssh-keygen <オプション>
オプション 説明
-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サーバとクライアントはユーザー認証を行わずホストの認証のみを行う。

認証手順は以下の通り。

  1. サーバの公開鍵をクライアントに送る
  2. クライアント側で保存されているサーバの公開鍵(場所は~/.ssh/known_hosts)と一致確認
  3. またホストベース認証の鍵のファイルパスは以下に配置される。
暗号化方式 鍵のファイルパス
RSA 秘密鍵 /etc/ssh_host_rsa_key
RSA 公開鍵 /etc/ssh_host_rsa_key.pub

13.5.4. 公開鍵認証

公開鍵認証はユーザ認証の方式の1つ。 認証フローは以下の通り。

  1. クライアント側で鍵ペア作る(ssh-keygen)
  2. クライアントの公開鍵をホストに渡す
  3. クライアントの鍵が使用できるか確認する
  4. クライアントの秘密鍵で署名を作る
  5. サーバに送る
  6. サーバ側の、クライアント公開鍵で署名を検証する

13.5.5. SSH Agent

SSH Agentは秘密鍵ファイルを使用する際にパスワード認証なしにログインすることができる仕組み。 秘密鍵をメモリ上に保存しておいて必要時に利用するようにすることで実現している。

利用は以下のように行う。

  1. ssh-agentの子プロセスとしてbashシェルの起動(ssh-agent bash)
  2. 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コマンドを使用する。