これは、このセクションの複数ページの印刷可能なビューです。 印刷するには、ここをクリックしてください.

このページの通常のビューに戻る.

3.Linuxサーバの高度な運用管理

LPIC Lv3の範囲(AD互換ツールのSamba-AD、セキュリティ応用、仮想化技術)など。Linuxサーバの高度な運用管理はこの項目でカバー。2025年1月現在LPIC300とLPIC303の一部をカバー。

1 - 1.Sambaの基礎

【LPIC300範囲】ファイルサーバといえばSamba。それ以外にも機能あるよ~などの説明。

1.1. Sambaの概念とアーキテクチャ

1.1.1. Sambaのバージョンと機能

Sambaとは

Microsoft Winodwsのファイル/プリンタ共有・認証機能をUnix/Linux OSに実装したOSSソフトウェアのこと。

Sambaサービスの実現にはSMB/CIFSプロトコルが利用される。

提供できる機能は以下の通り。

  • ファイルサーバ機能
  • プリントサーバ機能
  • WINSサーバ機能
  • ドメインコントローラ
  • ActiveDirectoryメンバーサーバ
  • Microsoftネットワーククライアント

Sambaのバージョン

Sambaには3.0系と4.0系がある。

機能Samba3Samba4
ドメインコントローラNTドメインのドメインコントローラ構築ができる(NTMLv2の使用、WINSサーバによる名前解決、LDAP連携の可能)ADドメインのドメインコントローラ構築ができる(Keroberos認証、DNSによる名前解決、LDAP内蔵)
ファイルサーバSMB2に対応SMB2,SMB3に対応

Samba3.0系のデーモンプロセス

Samba3.0系のデーモンプロセスはsmbdnmbにより提供される。

  • smbd * ファイル/プリント共有とユーザ認証機能 * ポート番号:139/TCP,445/TCP(SMB without NetBIOS)
  • nmbd * ブラウジング/NetBIOS名前解決機能 * ポート番号:137/UDP,138/UDP
  • winbindd * Linuxアカウント/Windowsアカウントを統合的に扱う仕組み * ポート番号: 445/TCP

Samba4.0系のデーモンプロセス

Samba4.0系のデーモンプロセスは3.0系に加えて以下のプロセスが追加されている。

  • samba
    • ActiveDirectoryドメインコントローラ機能
      • Keroberos認証
        • ポート番号:88/TCP・UDP
      • LDAP
        • ポート番号:389/TCP・UDP,636/TCP
      • Global Catalog * ポート番号:3268/TCP,3269/TCP

1.2. Sambaの設定

1.2.1. Sambaの起動

Sambaのコマンドによる起動

Sambaの起動方法はSystemdのシステムでは以下の通り。

systemctl start smb.client
systemctl start nmb.service

SysVinitを採用したシステムでは以下の通り。

/etc/init.d/smb start

testparmコマンド

testparmコマンドはsmb.confにミスがないかチェックできるコマンド

testparm [オプション]
オプション説明
-s構文チェック後Enter押さなくてもsmb.conf内容を表示
-v構文チェック後smb.confに記述されていない内容も表示

レジストリを使用した起動方法

設定ファイルを極力使用せずに、レジストリを使用して設定を行う方法がある。 この方法によるSambaのメリットは以下の通り。

  • Sambaサーバにログインせずにリモートで設定を行える
  • Sambaのデーモンの起動にかかる時間が短くなる。これはデーモンは必要なタイミングまでレジストリの設定データを読み込まないため。
  • 設定反映についてSambaのデーモンのリロードが不要になる

なお、レジストリベースのSamba設定とはWindowsのレジストリのような、階層を持つキーと値による設定形式のことであり、レジストリベースであっても設定自体は設定ファイル(バックエンド)に保存される。

1.2.2. smb.conf

Sambaサーバの設定はsmb.confファイルで行う。 なお、パッケージからインストールした場合は/etc/samba、ソースコードからインストールした場合は/usr/local/samba/etcディレクトリに格納される。

smb.confは全体設定、共有定義から構成される。

smb.confの構造は以下の通り。 コメントアウトは#;で可能。

# 全体設定
[global]
パラメータ名 = 値

# 共有定義
[homes]
パラメータ名 = 値

[printers]
パラメータ名 = 値

[セクション名1]
パラメータ名 = 値

[セクション名2]
パラメータ名 = 値
セクション説明
globalSamba全体設定
homes各ユーザのホームディレクトリ
printes共有プリンタの設定
共有名指定した共有に適用される設定

なお各セクションの真偽値はyes/true/1,no/false/0が使用できる。

globalセクションの設定

globalセクションではsmaba全体の設定を行う。 なお変更後はsambaの再起動が必要となる。

主要な項目は以下の通り。

[global]
    # Sambaサーバが所属するワークグループ名もしくはドメイン名を指定する
    workgroup = ワークグループ名|ドメイン名

    # Sambaサーバの動作モードを指定する
    server role = 動作モード
    # サーバ動作モード
    # AUTO : securityパラメータの設定に従う(デフォルト)
    # STANDALONE : スタンドアロンのサーバ
    # MEMBER SERVER : ドメインのメンバーサーバ
    # CLASSIC PRIMARY DOMAIN CONTROLLER : NTドメインのプライマリーコントローラ(PDC)
    # CLASSIC BACKUP DOMAIN CONTROLLER : NTドメインのバックアップドメインコントローラ(BDC)
    # ACTIVE DIRECTORY DOMAIN CONTROLLER : Active Domainのドメインコントローラ

    # NetBios名の指定
    netbios name = NETBios名

    # サーバの名前や説明の指定
    server string = コメント

    # 接続を許可するホストの指定(記載されていないホストは接続拒否)
    hosts allow = ホスト

    # ファイル共有に使用するポート(プロトコル)の優先順位の設定
    smb ports = 445 139 # CIFS優先

    # Guestアカウントの定義(アカウントが存在しないユーザにGuestとしてアクセスさせれる)
    guest account = ゲストユーザ名

    # Sambaユーザとして認証できない際の動作の指定
    map to guest = Never | Bad User | Bad password
    # Never: ゲスト認証の否認
    # Bad User: 存在しないユーザの指定でゲスト認証とみなす
    # Bad Password: Bad Userに加えてパスワード入力ミスの場合もゲスト認証とみなす

    # ログファイルの指定(「%m」で接続元ホストごとにログを分けれる)
    log file = ログファイル名

    # ログファイルの最大サイズをKB単位で指定
    max log size = サイズ

    # SambaサーバのログをWindowsのイベントビューアから参照する機能
    eventlog list = イベントログ名

    # ハッシュ値を用いた暗号化パスワードの使用を設定
    encrypt passwords = Yes | No

    # パスワード認証をsmbpassword方式で行う場合のパスワードファイルの指定
    smb password file = パスワードファイルのパス

    # SambaのパスワードとLinuxのパスワードを同期させるかの設定
    unix password sync = Yes | No
    passwd program = パスワードコマンドのパス
    passwd chat = 期待させる文字列

    # UNIXユーザを別ユーザ名とマッピングさせる
    # 「UNIXユーザ名=Windowsマシンのユーザ名」のように記述
    username map = マッピングファイル名

    # ログオフ時に実行するスクリプトファイルの指定
    logon script = スクリプトファイル名

    # SambaサーバをWINSサーバとして動作させる場合にYesを設定
    wins support = Yes | No

    # WINSサーバのIPアドレスをIPアドレスを指定する
    wins server = IPアドレス

homesセクションの設定

homeセクションでは各ユーザのホームディレクトリを指定する。

[home]
    browseable = no     # homesをブラウザリストに表示しない
    valid users = %S    # 共有にアクセス可能なユーザを制限

printersセクションの設定

共有プリンタの設定

[printers]
    printable = yes | no # スプールフォルダへの印刷データ書き込み許可設定
    path = スプールディレクトリのパス

共有名セクションの設定

指定した共有に適用される設定(以下例ではshare)を指定する。

[share]
    # コメントの指定
    comment = コメント

    # ブラウジングしたときの表示設定
    browseable = Yes | No

    # 書き込みの許可設定
    writeable = Yes | No
    read only = No | Yes

    # 共有ディレクトリのパスを指定
    path = ディレクトリのパス

    # 読み取り不可能なリソースの設定
    hide unreadable = yes | no

    # 共有内に作成するファイル/ディレクトリの所有者/グループを強制的に変換
    force user = ユーザ名
    force group = グループ名

    # 書き込みが例外許可されるユーザ/グループの指定
    write list = ユーザ名 | @グループ名

    # 「.」で始まる名前のファイル/ディレクトリを表示しないように隠し属性の適用の指定
    hide dot files = Yes | No

    # 任意の名前のファイルやディレクトリを表示させたくない場合に指定。「/」で複数指定可能。
    veto files = /ファイル名/

    # 共有内にファイルやディレクトリを作成する場合のパーミッション設定
    ############ AND演算 ##########################
    # ファイルに適用可能なパーミッション(Default:0744)
    create mask = mode
    # ディレクトリに適用可能なパーミッション(Default:0755)
    directory mask = mode
    ############ OR演算 ###########################
    # 必ずファイルに適用されるパーミッション(Default:0000)
    force create mode = mode
    # 必ずディレクトリに適用されるパーミッション(Default:0000)
    force directory mode = mode
    ###############################################

    # アクセス可能ユーザの指定
    valid users = ユーザ名

    # Guestユーザのログイン許可の指定
    guest ok = Yes | No
    public = yes | No

1.2.3. Samba変数

Sambaの設定ファイルsmb.confでは変数を使用できる。 以下のようなものがある。

変数説明
%D現ユーザーが所属するドメイン/ワークグループ名
%LサーバのNetBIOS名
%mクライアントのNetBIOS名
%Uサーバに接続しているユーザ名
%G%Uのプライマリグループ
%Sユーザが接続した共有名
%u共有に接続しているユーザ名
%g%uのプライマリグループ
%H%uのホームディレクトリ

1.3. Sambaの通常メンテナンス

1.3.1. Sambaの制御

Sambaを制御するための手段として構成ファイルに設定を記述する方法(smb.confの編集)とプログラムにメッセージを送る方法(smbcontrolコマンド)がある。

smbcontrolコマンド

smbcontrolはSambaのプロセス(smbd、nmbd、winbindd)にメッセージを送って制御するためのプログラムのこと。

smbcontrol [destination] [message-type] [parameter]
# 例
smbcontrol smbd shutdown
  • [destination] … メッセージの宛先を指定
    • smbd,nmbd,winbindd or allで指定
  • [message-type] … プロセスに送るコマンド
    • shotdown:デーモン停止
    • reload-config:設定ファイルの再読み込み
    • dubug ログレベル:指定したログレベルに変更
    • debuglevel:デバックレベルを問い合わせて表示
  • [parameter] … パラメータを必要とするコマンドの場合

smbstatusコマンド

Sambaサーバに接続しているクライアントの確認/サーバの稼働状況を確認できるコマンド。

共有に接続しているクライアントのユーザ名、グループ名、接続元IPアドレスとポートに加え、接続を受け付けたSambaのプロセスIDを表示する。

smbstatus

1.3.2. Sambaのログレベル

[global]セクションで使用されるログ設定に関わる主な設定項目は以下の通り。

項目説明
log file = ファイル名ログファイルを指定
log level = レベルログレベルの指定
max log size = キロバイトログファイルの最大サイズの指定
debug timestamp = yes/noログファイルに時刻を出力するかどうか
dubug hires timestamp = yes/noログファイル二秒単位以上の時刻を出力するか指定
debug pid = yes/noログファイルにPIDを出力するかどうか
debug uid = yes/noログファイルにUIDを出力するかどうか
eventlog list = イベントログ名SambaサーバのログをWindosのイベントビューアから参照する機能

Samba3系からはクラスごとにログレベルを設定できる。 使用できる主なクラスは以下の通り。

  • all … すべてのクラス(デフォルト)
  • tdb … TDBに関するログ
  • smb … SMBプロトコルのデバッグに関するログ
  • passdb … パスワードデータベースに関するログ
  • auth … 認証に関するログ
  • winbind … Winbindに関するログ

例)ログレベルを、パスワードデータベース関連は3、認証関連は4、その他は1に設定する場合

log level = 1 passdb:3 auth:4

1.4. Sambaのトラブルシューティング

1.4.1. TDB(Trivial Datadase)

TDB(Trivial Datadase)はSamba3.0から使用可能になったバイナリ形式の簡易データベースで様々な情報が格納されている。

smb -bコマンド

smb -bコマンドはTDBのディレクトリを確認できるコマンド

出力内容は長いため、通常はgrepコマンドを使用して必要な設定を確認する。

smb -b

tdbbackupコマンド

TDBファイルの検査およびバックアップとリストアを行うコマンド

tdbbackup [-v] TDBファイル名

-vTDBファイルの検査と、問題がある場合はバックアップからリストアを行うオプション。

tdbdumpコマンド

TDBファイルの内容表示を行うコマンド。

tdbdump

tdbtoolコマンド

TDBファイルの対話的な管理を行うコマンド。

tdbtool

tdbrestoreコマンド

tdbバックアップからリストアするコマンド。

tdbrestore > <リストアファイル> <  <バックアップファイル>

1.4.2. TDBファイル

Sambaが使用するデータベースファイルにはsercret.tdbregistory.tdbがある。

secret.tdb

Sambaが認証情報(ユーザー名、パスワードなど)を格納するためのデータベースファイル。

Sambaサーバーがユーザー認証を行う際に使用される。 通常、このファイルには、ユーザーのパスワードハッシュやアクセス許可情報などが保存される。

具体的に保存されるデータは以下のものがある。

  • machine/domain (SID)
  • LDAPと共に使用される秘密パスワード
  • machine 秘密トークン

registory.tdb

Sambaサーバーの設定情報を格納するためのデータベース。 Windowsレジストリのように、Sambaサーバーの構成や設定を管理する。

例えば、共有フォルダの設定、ユーザーのアクセス権限、ネットワークのパラメータなどがこのファイルに保存される。

1.4.3. Sambaパスワードデータベースに問い合わせ

smbpasswdコマンド

Sambaのパスワードデータベースを管理するためのユーティリティ。 パスワードの設定、変更、削除などを行う際に使用する。

smbpasswd

pdbeditコマンド

Sambaのパスワードデータベースを直接操作するための高度なユーティリティ。 ユーザーアカウントの追加、削除、属性の変更など、より広範な管理作業が可能。

pdbedit
オプション説明
-Lv詳細の表示
-aユーザの追加
-xユーザの削除

1.4.4. LDAP

LDAPとは

LDAPはネットワーク機器やユーザーID、パスワードを管理するディレクトリサービスの維持やアクセスを行うプロトコルのこと。 堅く言うと、X.500をベースとしたディレクトリサービスに接続するために使用されるプロトコルでDAPを軽量化したものともいえる。

一般的にLDAPは一元管理の認証サーバを構築する際に使用される。 LDAPによりユーザやリソースに関する情報を検索したり管理することができる。

LDIF

LDIFはディレクトリ内の情報を記述するファイル形式のこと。 LDAPサーバにディレクトリ情報を登録、変更する場合に使用される。 記法は以下の通り。

dn: 識別名
属性名: 値
属性名: 値
   :    

LDIFファイルでは最初の行でエントリの識別名(DN)を記述する。 また、複数のエントリを記載する場合は空行で区切り、コメントは行頭に「#」をつける。

なお、属性値は通常UTF-8のテキストで記載するが、バイナリデータなどの特殊なデータを指定する場合は「属性名::属性値」のようにし、属性値にはBase64でエンコードした値を指定する。

ldbsearchコマンド

LDAPデータベース内のエントリーを検索するためのコマンド。 指定されたクエリやフィルタを使用して、LDAPディレクトリ内の情報を検索する。

例えば、ユーザーアカウントやグループ、機器などの情報を検索するために使用される。

ldbsearch
オプション解説
-h 検索を行うLDAPサーバーのホストを指定します。
-b 検索のベースDNを指定します。
-s 検索のスコープを指定します。デフォルトはbaseで、oneまたはsubを指定できます。
-D バインドに使用するDNを指定します。
-Wパスワードをプロンプトで入力するように求めます。

ldbmodifyコマンド

LDAPデータベース内のエントリーを変更するためのコマンド。

LDIFファイルを使用して、エントリーの属性を変更する。 これにより、ユーザーの属性の更新やグループメンバーシップの変更などが可能になる。

ldbmodify
オプション解説
-h 変更を行うLDAPサーバーのホストを指定します。
-b 変更の対象となるエントリーのベースDNを指定します。
-D バインドに使用するDNを指定します。
-Wパスワードをプロンプトで入力するように求めます。

ldbeditコマンド

インタラクティブな方法でLDAPエントリーを編集するためのコマンド。

エディタを介してエントリーの属性を直接編集できる。これは、手動でのエントリーの編集が必要な場合に使用される。

ldbedit
オプション解説
-h エディットするLDAPサーバーのホストを指定します。
-b エディットの対象となるエントリーのベースDNを指定します。
-D バインドに使用するDNを指定します。
-Wパスワードをプロンプトで入力するように求めます。

ldbaddコマンド

LDAPデータベースに新しいエントリーを追加するためのコマンド。

追加するエントリーの情報を含むLDIFファイルを使用する。ユーザーアカウントやグループ、機器などの新しいエントリーをLDAPディレクトリに追加する際に使用される。

ldbadd
オプション解説
-h エディットするLDAPサーバーのホストを指定します。
-b エディットの対象となるエントリーのベースDNを指定します。
-D バインドに使用するDNを指定します。
-Wパスワードをプロンプトで入力するように求めます。

ldbdelコマンド

LDAPデータベースからエントリーを削除するためのコマンド。

削除するエントリーのDNを指定して使用する。 ユーザーアカウントやグループの削除など、LDAPディレクトリからエントリーを削除する際に使用される。

ldbdel
オプション解説
-h 削除を行うLDAPサーバーのホストを指定します。
-D バインドに使用するDNを指定します。
-Wパスワードをプロンプトで入力するように求めます。

2 - 2.SambaとActiveDirectory

【LPIC300範囲】SambaでAD互換機能を提供できるよ~っていう説明

2.1. ActiveDirectoryドメインコントローラとしてのSamba

2.1.1. ActiveDirectory

ActiveDirectoryとは

ActiveDirectoryはWindowsのサーバの機能で、ネットワークにつないでいるクライアント端末やサーバー、プリンター、アプリケーションなどの情報を収集し、一元管理できるディレクトリサービスのこと。アカウントの管理を行うディレクトリ・サービス・システムともいえる。

ActiveDirectoryを使用するメリットは全てのネットワークリソースを、一つのオブジェクトとして、一元管理することが出来るようになることにある。

ドメイン環境とドメインコントローラ(DC)

ActiveDirectoryではユーザやコンピュータなどのリソースがドメインに参加することによりリソースの一元管理することが可能となう。 この一元管理にはドメインコントローラ(DC)と呼ばれる専用サーバが使用される。

ドメインコントローラによる認証手順は以下の通り

  1. ユーザがドメイン参加コンピュータにログインする
  2. 認証データをドメインコントローラに送信する
  3. ドメインコントローラで認証データが正しいと確認できた場合チケットを発行し返送する
  4. チケットを受け取ったクライアントはチケットを提示してアクセス先コンピュータで認証を試みる
  5. アクセス先コンピュータはチケットがドメインコントローラで発行されたか確認し、正しければクライアントアクセスを許可する

上記認証方式はKeroberos認証と呼ばれる。

2.1.2. ActiveDirectoryの構成要素

ドメイン

ドメインはActiveDirectoryの基本単位Active Directoryデータベースを共有する範囲のこと。 言い換えるとACtiveDirectoryの管理が及ぶ範囲のこと。 ドメインを作成することで、組織のユーザー・グループ・コンピューターを集中して管理することが可能になる。

ActiveDirectoryデータベースにはユーザーオブジェクトをはじめとする、各オブジェクトの登録情報、共有フォルダやプリンタの情報、システムの構成情報などが保存される。

OU(組織単位)

OU(組織単位)は入れ物のことで、複数オブジェクトを簡単に管理することが可能なもののこと。 これはドメインで管理するリソースが増加した場合に、バラバラ管理となり負担がかかるのを防ぐためにある。

またOUはグループポリシー設定を割り当てたり、権限を委任することができる、最小単位となる。

ドメインツリー

ドメインツリーはドメインを複数に分け管理する機能*で、ユーザーオブジェクトやコンピューターオブジェクトの経営方針が異なる場合に使用できる。

ドメインツリーでは複数のドメインを作成するとき、親ドメインの下に子ドメインを作成することになるがこの際に必ず親ドメインからドメイン名の一部を継承する。 そして互いのドメインソースを利用できる関係性=「信頼関係」が結ばれることで、別のドメインで管理されていても、リソースを共有することが可能になる。

フォレスト

フォレストはドメインツリー同士に信頼関係を持たせた状態のこと。 同じ組織内でも、名前の階層を分けたい場合に用いる。また、フォレストはActive Directory構造におけるグループの最大単位となる。

フォレストは1つ以上のドメインツリーで構成されるため、実際には1つのドメインツリーでもフォレストとなり得る。

フォレスト構築の要件は以下の通り。

  • Active Directoryを拠点ごとに全く別々に管理を行う場合
  • Active Directoryを導入している企業同士が合併する場合
  • 組織内に異なる名前空間にしたいドメインツリーが複数存在する場合

2.1.3. FSMO(操作マスタ)

FSMO(操作マスタ)はドメインコントローラ(DC)の中で一番信頼する(優先する)ドメインコントローラのこと。 これはDCを複数構築している環境で、それぞれのDCから矛盾する設定を適応されてしまうと困ってしまうため、優先するDCを決めるということである。

FSMOの種類

FSMOには以下の種類がある。

操作マスタ役割構成
スキーママスタスキーマの原本(各オブジェクトに対するデータ型の定義情報)をもつドメインコントローラフォレストで1台のみ
ドメイン名前付けマスタドメインを追加したり削除したりする際に必要となるドメインコントローラフォレストで1台のみ
RIDマスタSIDを構成するために必要な「RID」情報を保持しているドメインコントローラドメイン全体で1台
PDCエミュレータアカウントのパスワードやロックアウト情報を管理しているドメインコントローラドメイン全体で1台
インフラストラクチャマスタドメイン内のユーザーやコンピューターと、グループアカウントのメンバー情報とのマッピング情報を保持ドメイン全体で1台

2.1.4. ドメインコントローラ(DC)のレプリケーション

ドメインコントローラはユーザ認証など重要な役割を果たすサーバであるため、もしドメインコントローラーにトラブルが発生して利用できなくなれば、システム全体に大きな影響を及ぼす。そこで一般的にはドメインコントローラーは2台以上のサーバーを用意し、何かあった場合に備え、どちらのサーバーも同じ役割を果たせるようにする

このとき、2台のドメインコントローラーは、同じ内容のデータベースを保持していなければならない。 そこでドメインコントローラはレプリケーションと呼ばれる、ドメインコントローラー同士が定期的にデータベースの内容を確認し、自動的にその内容を同一にするための同期処理を行っている。

2.1.5. ActiveDirectoryデータベースとSYSVOLフォルダ

ADには情報を管理するために、ActiveDirectoryデータベースとSYSVOLフォルダがある。

ActiveDirectoryデータベース

ドメインのユーザーやグループ、コンピューターアカウントなど、ドメインの管理に必要な各種オブジェクトの情報が管理されているデータベース。 DC間で自動レプリケーションする。

SYSVOLフォルダ

グループポリシーと呼ばれるドメインに参加している各コンピューター端末にシステム設定を配布する設定情報に関するデータが管理されているフォルダ。 DC間でレプリケーションしない。

rsyncrobocopyを用いてレプリケーションを行うように設定できる。

2.1.6. GlobalCatalog

GlobalCatalogはActiveDirectory内の全てのドメインの一部の属性を保持する特別なデータベースのこと。 GlobalCatalogによりクロスドメインの検索やクエリが高速化される。

ポートは3268/TCP3269/TCPが使用される。 なお通常、GlobalCatalogはActive Directoryの最初のドメインコントローラー(通常はフォレストのルートドメイン内のもの)に配置される。

Partial Attribute Se(PAS)

PASはグローバルカタログ内で保持される属性の部分集合のこと。 特定の属性のみをグローバルカタログに保持することにより、クライアントが迅速かつ効率的に検索やクエリを実行できる。

2.1.7. Samba-AD-DC

Samba-AD-DCとは

Samba-AD-DCはWindowsベースのActive Directory(AD)ドメインコントローラと互換性のある機能を提供することを目的とするOSSのソフトウェア。 Samba-AD-DCは、特に中小企業や教育機関などで、Windows環境とLinux/UNIX環境の統合を必要とする場合に役立つ。

Samba-AD-DCは、以下の主な機能を提供する。

  • ActiveDirectory互換性
    • Windowsクライアントや他のActive Directoryリソースと連携できる
    • LinuxやUNIXサーバーがWindowsベースのネットワークに統合され、シングルサインオン、ユーザー認証、アクセス制御などのActive Directory機能を利用できる
  • ドメインコントローラ機能
    • ドメイン内のユーザーアカウント、コンピュータアカウント、ポリシー、セキュリティグループなどの管理するドメインコントローラとして機能する
    • ユーザーとリソースの管理を中央集権化し、セキュリティと管理を向上させることができる
  • LDAPサーバ
    • LDAPサーバーを提供し、ディレクトリサービスの要件を満たす。ユーザー情報や認証情報などを保存および検索するために使用される。
  • DNSサーバ
    • Active Directoryに関連するDNSサービスも提供する。ドメイン内のリソースの名前解決が可能になり、正確なドメイン構造が維持される。

2.2. ActiveDirectoryの名前解決

2.2.1. ドメインコントローラの検索

ドメインコントローラを見つけ出すのにDNSが使用される。 このDNSはドメインコントローラ(DC)を作成した際にSRVレコードAレコードが生成されるので、これをDNSサーバに登録することで利用できる。

  • SRVレコード … ドメインコントローラーが提供するサービスが登録されているリソースレコード
  • Aレコード … ホスト名をIPv4に変換するためのリソースレコード

2.3. ActiveDirectoryのユーザ管理

2.4. Sambaドメインメンバーシップ

2.5. Sambaのローカルユーザ管理

3 - 3.Samba共有の設定

【LPIC300範囲】未記載

3.1. ファイルの共有設定

3.2. ファイル共有のセキュリティ

3.3. DFS共有構成

3.4. プリンタ共有の設定

4 - 4.Sambaクライアントの設定

【LPIC300範囲】未記載

4.1. Linux認証クライアント

4.2. Linux CIFSクライアント

4.3. Windowsクライアント

5 - 5.Linuxアイデンティティ管理/ファイル共有

【LPIC300旧範囲】FreeIPA(Linux認証基盤)に関する説明

5.1. FreeIPAのインストール/メンテナンス

5.1.1 FreeIPA

FreeIPAはLinuxの統合認証基盤のこと。 オープンソースで開発されており、KerberosやDNS, SELinuxなどを用いて統合された認証環境を提供する。 なお、IPAはIdentity, Policy, Auditの略である。

また、クライアントのコンポーネントとしてSSSDを使用している。

FreeIPAで管理できる対象(エンティティ)には以下の通り。

  • ユーザ/グループ
  • SMB共有
  • SSH認証鍵

FreeIPAのコンポーネント

FreeIPAは以下のコンポーネントで構成されてる。 またFreeIPAのコンポーネントには汎用のLinuxシステムが統合されている。

コンポーネント説明
389 Directory ServerLDAP
MIT Keroberos認証サービス
Dogtag Certificate SystemPKI(公開鍵基盤)
NTP時刻同期
DNSIPアドレス/ドメインの紐づけ
SSSD識別/認証サービス管理
Certmonger証明書期限の監視/更新

5.1.2. FreeIPAのインストール

FreeIPAは、インストール自体はスクリプト化されており容易にできる。 求められるスペックは以下の通り。

  • ユーザ数 10,000、グループ数 100 … 最低 2GB の RAM と 1GB のスワップスペース
  • ユーザ数 100,000、グループ数 50,000 … 最低 16GB の RAM と 4GB のスワップスペース

FreeIPAサーバ/ドメインのインストール

  • ipa-server-install … IPAサーバのインストール
  • ipa-client-install … IPAクライアントのインストール
  • ipa-replica-install … IPAサーバのレプリカインストール
  • ipa-replica-prepare … IPAサーバのレプリカ用イメージファイル作成
  • ipa-replica-manage … IPAレプリカサーバの設定確認など

5.1.3. ADのレプリケーションとKerberosのCrossRealm認証

Kerberosではrealmという管理対象ノード群の枠組みがある。 realmは複数作成することができるが、複数のrealm間で相互に信頼関係を構築する方法をCrossrealmと呼ぶ。

CrossRealm認証によりADとの信頼関係を構築することで、ADドメインに参加しているユーザがLinuxマシンへSSOができるようになったり、Linuxドメインのサービスやリソースへアクセスできるようになる(Windowsクライアントの管理はできません)。

IPAとADとのCrossRealm認証はipa-adtrust-installによるSamba(CIFS)の構築とipa trust-addコマンドによる信頼関係の構築を行う必要がある。

sudo、autofs、SSHおよびSELinuxの統合

FreeIPAのクライアントではSSSDがデフォルトで構成される。 SSSDによって、sudoの統合、ホストベースのアクセス制御(HBAC)のポリシー、SELinuxユーザマッピングなどができるようになる。 これらの設定は、FreeIPAの4.0以降のバージョンでは基本的にインストール時に設定される。

  • sudo … LDAPにファイルを登録することにより統一的に管理することができる
  • SSH … LDAPに公開鍵をインストールすることで、ホストローカルな設定ファイルをドメイン対応させることができる
  • SELinuxユーザマッピング … SELinuxでは、ホストベースのアクセス制御(HBAC)をドメインに提供する。リモートユーザや新しいホストの追加時に一貫した制御ポリシーを適用・管理できる

5.1.4. ipaコマンド

ipaコマンドはFreeIPAでユーザ・グループの管理やドメインの操作などを行うことができるコマンド。

ipa <コマンド> [パラメータ]
コマンド説明
user-addユーザの追加
user-delユーザの削除
group-addグループの追加
group-delグループの削除
user-findユーザの検索
group-add-memberグループへのユーザ追加
user-showユーザ情報表示
group-showグループ情報表示
trust-addドメインの信頼関係追加

5.2. FreeIPAのエンティティ管理

5.3. FreeIPAのActiveDirectoryインテグレーション

5.4. ネットワークファイルシステム(NFS)

5.4.1. NFSv4

NFS(Network File System)はLinuxでの一般的なファイル共有プロトコル。 NFSv4はNFSのVersion4.0。

NFSv4の主な特徴は以下の通り。

  • セキュアな認証メカニズム「Kerberos」「SPKM」「LIPKEY」の導入
  • 擬似(Pseudo)ファイルシステムの提供
  • ACLによるアクセス制御
  • パフォーマンスの改善(一部の権限をクライアント側へ委譲)

NFSv4の認証メカニズム

NFSv4では、セキュアな通信を確立するために以下の認証メカニズムが採用された。

認証メカニズム説明
KeroberosSSOを使用可能にする
SPKMシンプルな公開鍵基盤を提供する認証方式
LIPEKYSPKMを使用したクライアント-サーバ間で暗号化通信を行う

疑似(Pseudo)ファイルシステム

擬似(Pseudo)ファイルシステムは複数のファイルシステムをクライアント側で一つのツリーに見せかけることができる仕組み。 これはNFSv3の欠点を補った仕組みともいえる。

NFSv4サーバの設定

  • /etc/exports
    • NFSv4の共有ディレクトリの設定は/etc/exportsで行う
  • /etc/idmapd.conf
    • NFSv4のデーモンの挙動を設定する

5.4.2. CIFS

CIFSはSMBを拡張したファイル/プリンタ共有などのプロトコル。 CIFSはWindows系OS以外でも利用できるように仕様が公開されている。

CIFSには以下のような特徴は以下の通り。

  • Unicodeに対応
  • oplockと呼ばれる便宜的ロックにより、共有ファイルへのロック情報をクライアントでキャッシュすることで高いパフォーマンスを発揮

CIFSによるファイル/ディレクトリのパーミッション

Linux上でマウントしたWindowsマシンの共有は、デフォルトでrootユーザが所有者として設定され、一般ユーザでは書き込みができない。 WindowsのファイルシステムにはLinuxのような所有者やパーミッションの仕組みが無いため起こる 。 Windowsマシンの共有の所有者やパーミッションを設定するには、マウント時のオプションとしてUIDやGID、ファイルやディレクトリのパーミッションを指定する必要がある。

CIFSのセキュリティモード

  • NTLM(NT LAN Manager authentication) * Windows OSのネットワークにおける認証方式の一つ * 共有フォルダや共有プリンタなどに利用される
  • Keroberos * SSO認証を可能にする認証方式

CIFSのマウント/アンマウント

CIFSのマウントにはmount.cifsコマンド、もしくはmount -t cifsを使用する。 なおアンマウントはunmountコマンドで行う。

setcifsaclコマンド

CIFSのACLに関する操作を行うコマンド。

setcifsacl <オプション>

getcifsaclコマンド

CIFSのACLに関する操作を行うコマンド。

getcifsacl <オプション>

6 - 6.Linuxの暗号化

【LPIC303範囲】SSL/TLS、Linuxファイルシステム、DNSの暗号化のための解説

6.1. 暗号化の基礎

6.1.1. 暗号化とは

暗号化は暗号文を使用して通信と情報を保護する手法のこと。

コンピュータサイエンスにおいて、暗号化は、解読が困難な方法でメッセージを変換するための、数学的概念とアルゴリズムと呼ばれる一連のルールベースの計算から派生した安全な情報および通信技術を指す。 これらの決定論的アルゴリズムは、暗号キーの生成、デジタル署名、データ プライバシーを保護するための検証、インターネット上の Web ブラウジング、クレジット カード取引や電子メールなどの機密通信に使用される。

暗号化の用途

  • 暗号化 … 情報をその本当の意味を隠す秘密コードに変換する方法。情報の暗号化と復号化の仕組みは暗号化と呼ばれる
  • 完全性 …. 情報は、変更が検出されない限り、保存中または送信者と目的の受信者の間での転送中に変更されることはないことを保証する
  • 認証 … 送信者と受信者は、互いの身元と情報の発信元/宛先を確認できる

暗号化の主要な要素

暗号化には2つの主要な要素がある。

  • キー … データの暗号化に使用されるもの。秘密にしておく必要がある
  • アルゴリズム … メッセージのエンコードとデコードに使用されるメソッドのこと。

共通鍵暗号方式(対称暗号方式)

共通鍵暗号方式は暗号化と復号を同じ鍵で行うもの

AESDESblowfishなどが代表例としてある。

このタイプの暗号化は、平文を暗号文に暗号化し、その暗号文を平文に復号化するために同じ鍵が使われるため対称と言える。 一般的に、非対称暗号化よりも高速となる。

公開鍵暗号方式(非対称暗号方式)

公開鍵暗号は暗号化/復号化に公開鍵ペアを使用する暗号。 対になる鍵の一方が公開鍵で、もう一方が秘密鍵となる。

説明
公開鍵一般にアクセス可能なリポジトリで公開され、公開鍵ペアの所有者と通信する必要がある人は誰でもアクセス可能
秘密鍵秘密鍵は所有者のみが所有する

これらの鍵はそれぞれ平文を暗号化された暗号文に変換することができるが、 一方の鍵で暗号化された暗号文はもう一方の鍵でしか復号できない

特徴は以下の通り。

  • 公開鍵で暗号化された暗号文は秘密鍵でしか復号化できない
  • 秘密鍵で暗号化された暗号文は公開鍵を使ってのみ復号できる
  • 共有秘密鍵を交換することなくメッセージを送信できる

またRSA暗号方式による秘密鍵の生成に関しては「512bitや1024bit程度の長さは容易に計算できる」とされているため、2048bit以上の長さを用いることが推奨されている。

ハッシュによるデータの整合性

ハッシュ関数を用いた暗号化では特定のデータを一定長の固定サイズの値に変換する暗号化を行う。この変換された値はハッシュ値と呼ばれる。

ハッシュの特徴は以下の通り。

  • ハッシュ関数は固定長の出力を生成する
  • ハッシュ値から元のデータを再構築するのは困難(一方向性)
  • セキュリティを向上させるためにソルトを使用してハッシュ化する方法がある
  • ハッシュアルゴリズムにはCRC2(非推奨)md5、**sha-1*などがある

6.1.2. 公開鍵基盤(PKI)とトラストチェーン

公開鍵基盤(PKI)

PKI(公開鍵基盤)は異なるコンピュータシステム間の通信を保護するために使用されるシステムのこと。 暗号化に用いられる「公開鍵」と「公開鍵の持ち主」の関係を保証する仕組みともいえる。

PKIは暗号化キーのペアとデジタル証明書に基づき、公開鍵基盤は認証局の階層と証明書署名要求プロセスで構成される。

認証局(CA)

認証局(CA)はWeb サイト、電子メール アドレス、企業、個人などの身元を検証するために機能する組織のこと。 公開キーの信頼性を検証する第三者といえる。

デジタル証明書として知られる電子文書の発行を通じて、それらを暗号キーにバインドする。 公開キーの信頼性を検証する信頼できる第三者機関と言える。

認証局には以下の役割がある。

  • 有効なCSRに署名する
  • 秘密鍵のセキュリティを維持する
  • 侵害された証明書または悪用された証明書を取り消す

証明書署名要求(CSR)

証明書署名要求(CSR) は基本的に生成される公開キーであり、CA に送信して署名を受けることができるもの。

CAがCSRに署名すると、署名したCAによって信頼される証明書が生成される。

OCSP/CRL

OCSP (オンライン証明書ステータス プロトコル) または CRL (証明書失効リスト) を使用して証明書を無効にするための仕組み

CAによって使用される。

トラストチェーン

トラストチェーンはX.509が想定する認証局のシステムも、認証局が下位の証明局を認証し、その下位の認証局がさらにその下に位置する認証局を認証する…といった証明の連鎖で成り立つことを想定し「信頼できるものが署名したものは信頼の連鎖に加えられる」という前提に成り立っている様子のこと。

6.1.3. 公開鍵証明書(ディジタル証明書)と認証局

公開鍵暗号方式においては公開鍵証明書によって公開された鍵が意図している所有者のものであることが保証されている必要がある。

公開鍵証明書は、信頼できる第三者として認証局(CA:Certification Authority)によりデジタル署名(後述)されて発行され、その証明書に含まれる公開鍵の真正性と有効性(公開鍵の所有者が正当な所有者であること、証明書が有効期限内であること等)を保証する仕組みです。ちょうど、公的身分証明書が、信頼できる公的機関の発行証明によって信頼性を担保するのと似ている。

公開鍵証明書には、公開鍵そのものに加えて発行者の情報や有効期間などの情報が含まれる。

ディジタル署名

デジタル署名はデータが通信の途中で改ざんされていないこと、またメッセージが作成者本人のものであることを証明するための技術

デジタル署名は送信するメッセージからハッシュ関数を用いてメッセージダイジェスト(MD)を求め、MDから秘密鍵を用いて署名を生成し送信する。 受信者は、公開鍵を用いて署名を検証(MDを復号)する。

またメッセージからMDを求め、復号したものと照合し、一致していることを確認するという仕組みといえる。

認証局(CA)

認証局(CA)はWeb サイト、電子メール アドレス、企業、個人などの身元を検証するために機能する組織のこと。

デジタル証明書として知られる電子文書の発行を通じて、それらを暗号キーにバインドする。 公開キーの信頼性を検証する信頼できる第三者機関と言える。

認証局には以下の役割がある。

  • 公開鍵証明書の発行 * 認証局は電子証明書の発行依頼を受けて、申請内容と証明書署名要求(CSR※)と呼ばれる情報を精査した上で公開鍵証明書を発行する
  • 公開鍵証明書の失効、CRLの発行 * 認証局は申請を受けて証明書の失効手続きを行い、証明書が失効されていることを以下の二つの手段で公開する * 証明書失効リスト(CRL:Certificate Revocation List)の発行 * OCSP(Online Certificate Status Protocol)への応答

また認証局にはパブリック認証局とプライベート認証局(オレオレ認証局,自己証明認証局)がある。 パブリック認証局の発行したルート証明書(認証局が自らの正当性を証明するために発行するデジタル証明書)は、いわゆる公的機関の証明書の扱いであり一般的なメーラやブラウザに組み込まれている。対してプライベート認証局は社内などの制限された場だけで利用することを想定されたもの。運用規定を自由に設定できるという柔軟性がある。

6.1.4. サーバ証明書とクライアント証明書

サーバ証明書

サーバ証明書はでクライアントがアクセスしているサーバが確かに目的の相手に間違いないことを確認するために使用されるもので、サーバの公開鍵を含んだ証明書に認証局が署名をして発行されているのが一般的となる。企業内などでは、プライベート認証局を使って自己署名が行われる場合もある。

Webサイトなどにアクセスする際に提示される。

クライアント証明書

クライアント証明書は企業内LANや外部から自社内にアクセスする場合、クライアント側が正当な権利を持っているか確認する必要がある場合に用いられるもの。

6.2. X.509証明書と公開鍵暗号基盤

6.2.1. OpenSSL

SSLの実装としてのツールにOpenSSLがある。 SSLはWebサーバとWebブラウザ間でよく使用される暗号化通信を行うための設定で、使用にはサーバ証明書が必要になる。

サーバ証明書にはサーバについての情報と、サーバの公開鍵、証明書を発行した認証局の情報とその署名が含まれる。 署名は、証明書を発行する認証局(CA)が「認証局の秘密鍵」で行う。SSLサーバはこの証明書をクライアントに渡し、クライアントであるブラウザは予め内蔵している認証局の公開鍵を使って、受け取った証明書の署名を復号する。復号できれば証明書が改ざんされていない(接続先サーバが正しい)ことが確認できる。

なお、サーバ証明書の署名はルートCAもしくは中間CAによって署名されますが、現在ではセキュリティレベルの向上などの理由で、ルートCAが直接署名するのではなく、中間CAを1つ以上用いる階層構造を取る認証が主流となっている。

opensslの設定ファイル

openSSLの設定ファイルは以下の通り。

  • Debian系 … /usr/lib/ssl/openssl.cnf
  • RedHat系 … /etc/pki/tls/openssl.cnf

opensslコマンド

OpenSSLの操作を行うコマンド。

openssl <サブコマンド> [オプション]
サブコマンド説明
caCAの管理
dgstメッセージダイジェストの計算
genrsaRSA暗号方式の秘密鍵を生成
rsaRSA暗号方式の鍵管理
reqCSRの管理
x509X.509証明書の管理
s_clientSSL/TLSプロトコルを使用し指定しサーバ接続
s_serverSSL/TLSプロトコルを使用しデータを受け取るサーバとして動作
ciphers使用可能な暗号スイートを一覧表示
verifyX.509証明書の検証

OpenSSLのコマンド例

# 設定ファイルの確認
openssl ca

# 秘密鍵の作成
openssl genrsa -des3 2048 > /etc/pki/CA/private/cakey.pem

# 秘密鍵の作成
openssl genrsa -<algorithm> -out <key_filename> <key_size>
openssl genrsa -aes128 -out mykey.key 2048

# 公開鍵の作成
openssl req -utf8 -new -key <key_filename> -x509 -days <cert-lifespan> -out <cert_filename> -set_serial 0

# CSRにCAとして署名する
openssl ca -in <CSR> -out <crt>

# CSRの作成
openssl req -new -key <priv_key.pem> -out <output.csr>

# 証明書情報の確認
openssl x509 -in <cert_filename.crt> -text -nout | less

OpenSSLによる証明書の作成と操作

opensslコマンドにより秘密鍵/証明書などを作成できる。 使用例は以下の通り。

# 秘密鍵の生成
openssl genrsa -<algorithm> -out <key_filename> <key_size>
openssl genrsa -aes128 -out mykey.pem 2048

# 自己証明書(オレオレ認証)の生成
openssl req -utf8 -new -key <key_filename> -x509 -days <cert_lifespan> -out <cert_filename>

#認証の表示
openssl x509 -in mycert.crt -text -noout

#CSR(証明書失効リスト)の作成
openssl req -new -key <priv_key.pem> -out <output.csr>

OpenSSLによるX.509証明書形式の変換

#DERをPEMに変換する
openssl x509 -inform der -in certificate.cer -out certificate.pem

#PEMをDERに変換する
openssl x509 -outform der -in certificate.pem -out certificate.der
#p7b/pkcs#7をPEMに変換する
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.pem.

#PEMをp7b/pkcs#7に変換する
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer

OpenSSLによるトラブルシューティング

## セキュアなコネクションの確立
openssl s_client -connect <host>:<port> 

## トラストチェーンの検証 
openssl verify -verbose <certificate> 

## CAチェーンのすべての証明書を確認する
openssl s_client -connect <host>:<port> -showcerts

## 証明書の詳細を見る
openssl x509 —text <cert_file> 

6.2.2. Genkey

genkeyはOpensslの互換ツールでRedHat系OSで使用できるもの。 コマンドはOpenSSLより単純で、TUIが使用できる。

6.2.3. X.509証明書

X.509とはITU-T(国際通信連合(ITU)の電気通信標準化部門)の規格であり、公開鍵暗号方式に基づいて認証局によって発行される公開鍵証明書の標準形式などを定めてたもの

X.509証明書にはいくつかのエンコードタイプがあるが、代表的なものにPEMDERがある。

  • PEM
    • DERをBase64でテキスト化したもの
    • サーバー証明書、中間証明書、および秘密キーを1つのファイル内に含めることができる
    • テキスト エディタで開くことができる
    • OpenSSLデフォルトのファイル形式
  • DER
    • JavaベースのWebサーバーに使用される
    • Binary形式
  • PKCS#7
    • 証明書のみを保存する
    • 秘密キーは保存できない
  • PKCS#12
    • Windowsプラットフォームで使用される
    • サーバー証明書、中間証明書、および秘密キーをパスワードで保護された単一の.pfxファイル内に保存できる

また、それぞれの特徴を表にまとめると以下の通り。

フォーマットエンコードファイルフォーマット
PEMBase64 ASCII.crt、.pem、.cer、.key
DERBinary.der または .cer
PKCS#7Base64 ASCII
PKCS#12Binary.pfx、 .p12

X.509証明書のフィールド

フィールド1フィールド2説明
tbsCertificate証明書の基本情報と公開鍵の情報
versionX.509証明書のバージョン X509v3では3(0x2)
serialNumber証明書の識別番号
signatureCAが証明書に署名する際のアルゴリズム
issuerCAの名前
validity証明書の有効期間
subject証明書の所有者の名前
subjectPublicKeyInfo証明書所有者の公開鍵に関する情報
extentions拡張領域。X.503v3にて追加
signatureAlogorithm証明書の署名アルゴリズム
signatureValueデジタル署名

X.509証明書の拡張フィールド

拡張フィールド説明
basicConstraints基本制約。証明書がCAnのものである、証明書のパスの深さなどを指定
authorityKeyIdentifier認証局鍵識別子
subjectKeyIdentifierサブジェクト識別子
KeyUsaga鍵の用途
extendedKeyUsage拡張鍵用途
certificatePolicies証明書の目的や発行時情報
subjectAltNameサブジェクトの代替名
cRLDistributionPointsCRLの配布ポイント
authorityInfoAccess機関情報アクセス

6.3. 暗号化/署名および認証のX.509証明書

6.3.1. SSL/TLS

SSL(Secure Sockets Layer)/TLS(Transport Layer Security)はトランスポート層の暗号化プロトコルでWebトランザクションを保護するために開発されたが、トランスポート層でTCPを利用するあらゆる種類のネットワークトラフィックの保護にも使用できる

TLSとしてIETFによってRFC化され、SSL3.0からTLSが派生した。SSL3.1がTLS1.0に該当します。一般的名称として、SSLという言葉が広く普及しているため、SSL/TLSと呼ばれている。

現在、SSLは脆弱性が発見されているため使用は非推奨となっており、TLSの使用が推奨されている。暗号強度等ではTLS1.2、もしくは2018年3月にIETFに承認されたTLS1.3が良い。

項目SSLTLS
正式名称Secure Sockets LayerTransport Layer Security
プロトコルWeb トラフィックを保護するために使用されていたプロトコルTLS プロトコルは、SSLv3 に代わる TLS 1.0 から始まる SSL の後継プロトコル
状況最新バージョンは SSLV3 だが、これは非推奨現在の標準は TLS 1.2 。ただし、TLS 1.3 はインターネット標準として目的とされている

TLS/SSLのハンドシェイクプロセス

TLS は、データを安全に送信する際のパフォーマンスとセキュリティの間で適切な妥協点を提供するため、公開鍵暗号方式と共通鍵暗号方式を組み合わせて使用​​する。 手順は以下の通り。

  1. 各TLS証明書は、公開キーと秘密キーで構成されるキーペアで構成される。これらのキーは、Web サイトのトランザクション中に相互作用する。
  2. Web サイトにアクセスするたびに、クライアント サーバーと Web ブラウザが通信して、安全な TLS/SSL 暗号化接続が確立されていることを確認する。
  3. Web ブラウザ (またはクライアント) がセキュリティで保護された Web サイトにアクセスすると、Web サイト サーバーは TLS/SSL 証明書とその公開キーをクライアントと共有して、安全な接続と一意のセッション キーを確立する。
  4. ブラウザは、SSL 証明書の発行者または認証局を認識し、信頼していることを確認します。また、ブラウザは、TLS/SSL 証明書の有効期限が切れていないこと、取り消されていないこと、および信頼できることを確認します。
  5. ブラウザは対称セッションキーを送り返し、サーバーは秘密キーを使用して対称セッションキーを復号化する。次に、サーバーはセッションキーで暗号化された確認応答を送り返し、暗号化されたセッションを開始する。
  6. サーバーとブラウザは、送信されるすべてのデータをセッションキーで暗号化するようになる。これらは、メッセージのプライバシー、メッセージの整合性、およびサーバーのセキュリティを保護する安全なセッションを開始することを意味する。

トランスポート層のセキュリティ

SSL と TLS はどちらも以下のセキュリティ要件を満たす。

  • 交換されるデータを安全に暗号化する
  • 少なくとも1人の当事者を認証する
  • データの整合性を確保する
  • リプレイ攻撃を防ぐ

トランスポート層のセキュリティは、PKI と一般的な暗号化の使用を通じてこれを実現する。

SSLに対する中間者攻撃

  • POODLE攻撃の脆弱性 * POODLE攻撃(CVE-2014-3566) はSSLセッション内の選択されたコンテンツを復号化できる中間者(MITM) エクスプロイトのこと。
  • BEAST攻撃の脆弱性 * BEAST攻撃(CVE-2011-3389)はSSL/TLS 暗号ブロック チェーン (CBC) の弱点を悪用し、中間者攻撃者が Cookie データなどの特定のセッション情報を何からでも回復できるようにする。

ApacheのHTTPSの設定(SSL/TLSを使ったHTTP)

HTTPSと呼ばれるプロトコルはWebのプロトコルであるHTTPをSSL/TLSでセキュアなプロトコルとして通信させるもの。 代表的なWebサーバ(httpd)であるApacheもSSL/TLSに対応しており、パッチまたはモジュール(mod_ssl)での対応が可能となっている。

Apacheの基本的な動作設定は/etc/httpd/conf/httpd.confにて行う。 SSLの設定も同ファイルに記述できるが、デフォルトでは/etc/httpd/conf.d/ssl.confが用意されており、ここに記述するのが一般的となる。

サーバ認証関連のディレクティブ説明
SSLEngine on/offSSL/TLSプロトコルを使用するかどうかの設定
SSLProtocol SSLv3/TLSv1/TLSv1.2SSL/TLSのバージョン指定
SSLCipherSuite !AAA/-AAA/+AAA使用する暗号化スイートの指定
SSLCertificateFileサーバ証明書の指定
SSLCertificateKeyFileサーバの秘密鍵を指定
SSLCertificateChainFile中間認証局(CA)の証明書を指定
クライアント認証関連のディレクティブ説明
SSLCACertificateFileクライアント証明書を発行したCAの証明書を指定
SSLVerifyClientクライアントの認証レベルの指定
SSLVerifyDepth有効なクライアント証明書を確認する深さを指定
OCSP stapling関連のディレクティブ説明
SSLUseStapling on/offOCSP staplingの有効/無効
SSLStaplingResponderTimeiutOCSP staplingの応答タイムアウト
SSLStaplingReturnResponseErrors on/offOCSP staplingのエラーをクライアントに送信するかどうか
SSLStaplingCacheOCSP staplingのキャッシュに使用するストレージタイプ
SNI関連のディレクティブ説明
SSLStrictSNIVhostCheck on/off非SNIクライアントの挙動設定

SNI

SNI(Server Name Indication)は1つのWebサーバで複数のドメインのSSL/TLS証明書を利用できる仕組み。 名前ベースのVirtualHostであってもSSLに対応できるようにしたSSL/TLSの拡張仕様ともいえる。

SNIでは、コネクション確立時にクライアントからサーバへアクセスしたいホスト名を渡すことにより、適切なサーバ証明書を返すことができる仕様とした。 これにより、コネクション前にホスト名を確認することが可能となり、名前ベースの仮想ホストを使用可能となった。

HSTS

HSTS(HTTP Strict Transport Security)はWebセキュリティの仕組みの一つでウェブサイトがHTTPSを使用することを強制するための仕組みのこと。 HSTSはウェブブラウザに対して、特定の期間内でHTTPSを使用するように指示する。

HSTSの主な目的はMITM攻撃を防ぐことにある。 通常、攻撃者はHTTP通信を盗聴し、変更することができるが、HTTPSを使用すると通信が暗号化され、改ざんや盗聴が難しくなる。 HSTSは、ウェブサイトがHTTPSを使用するように強制し、ユーザーが暗号化された通信を確実に得ることを支援する。 クライアントが一度HTTPSでアクセスしたサイトがHSTSを強制するようクライアントに指示した場合、以後一定の有効期間内はクライアント側からはHTTPSで通信を行うようになる。

また、初回のHTTPSアクセスまでの脅威に対応するため、予め「このドメインはHSTSに対応している」という情報をブラウザ側に知らせておく「プリロードHSTS(Preload HSTS)」という仕組みも提唱されてきている。

Apacheのクライアントアクセス制御

SSL/TLSを利用したApacheでは、クライアントの証明書を使ってアクセス制御を行うことができる。 「ssl.conf」では設定項目SSLVerifyClientにより、クライアントに対して証明書を提示させるよう指定することができる。

OCSP Stapling

OCSPはクライアントがOCSPサーバ(OCSPレスポンダ)へ問い合わせを行い、証明書の失効確認を行うためのプロトコル

しかし、レスポンダとの通信次第で問い合わせに遅延が発生し、確認手続きが失敗するなどの弊害もあった。これに対応する方法としてOCSPを拡張したものが、OCSP stapling(OCSPステープリング)となる。 クライアントが行っていたOCSPレスポンダへの問い合わせを証明書提供側のサーバが行うことにより、クライアントが確認手続きで失敗するリスクをなくす。 「ssl.conf」では設定項目SSLUseStaplingにて有効化するか否かを選択できる。

#OCSP Stapling: 
SSLUseStapling On 
SSLStaplingCache "shmcb:logs/ssl_stapling(32 768)"

CipherSuite

CipherSuiteは暗号化の組み合わせのことを指す。 SSL/TLSで使用できる暗号化には様々な種類があり、暗号といっても、目的によって使用できる暗号技術が異なる。

SSL/TLSの動作は複数の暗号技術の組み合わせで成り立っており、通信の開始から終了までの間に数種類の暗号技術を使用する。 この組み合わせは暗号スイートと呼ばれ、OpenSSLではopenssl chipersコマンドで使用できる暗号スイートを確認できる。

6.4. 暗号化ファイルシステム

6.4.1. ディスク暗号化の基礎

ディスク全体の暗号化は盗難や偶発的な紛失の場合にディスクを保護する。 ディスク全体の暗号化では、スワップファイル、システムファイル、休止状態ファイルを含むディスク全体が暗号化される。 暗号化されたディスクが紛失、盗難された場合でも、ドライブの暗号化状態は変更されず、許可されたユーザーのみがその内容にアクセスできる。

ファイルの暗号化では起動中にシステムにログインし、その後コンピュータを放置した場合、権限のないユーザーはディスク上の任意のファイルを開くことができないようにできる。 またファイルシステムの暗号化は以下の方法がある。

  • ブロックデバイス
  • ファイルシステムレベル

ディスク暗号化ツール

ディスクを暗号化するためのツールは以下のようなものがある。

  • dm-encryptLUKS (通常は連携して使用する)
  • cryptmount (エンドユーザーがデータを暗号化するのに役立ちます)
  • eCryptfs (ファイル システム レベルの暗号化)
  • EncFS (eCryptfs互換)

6.4.2. ブロックデバイスとファイルシステムの暗号化

dm-cryptとLUKS

dm-cryptsはブロックデバイスの暗号化を行う暗号化の方法の1つ。 dm、すなわちdevice-mapper(デバイスマッパー:物理デバイスと論理デバイスをマッピングするLinuxカーネルの標準機能)の暗号化機能を使ってデバイス全体に対する暗号化を行う。

dm-cryptを扱うためのツールには以下の2つがある

  • cryptsetup … 暗号化デバイスの作成・管理・各種操作
  • cryptmount … 暗号化ファイルシステムのマウント・アンマウントなど

cryptsetupコマンドでは、暗号化のタイプとしてplain(plain dm-crypt)モードLUKSモードを選択することができる。

LUKS(Linux Unified Key Setup:ラックス)とはLinuxにおけるディスク暗号化の標準仕様で、dm-cryptを用いて実装されている。 ファイルシステムに依存しておらず、Linuxで一般的なファイルシステムのext3やext4、Brtfs、さらにSWAP領域を暗号化することも可能である。

  • /etc/crypttab
    • cryptsetupで設定した暗号化ボリュームをOS起動時に自動的にマウントするためには、「/etc/crypttab」にエントリを追加する必要がある
    • 「/etc/crypttab」は「/etc/fstab」より先に読み込まれるため、暗号化を解除した上で復号されたファイルシステムをマウントすることが可能になる

eCryptfs

eCryptfsはファイルシステムの暗号化を行う技術の一つで、ファイルやディレクトリを暗号化することができるもの。 dm-cryptと異なり、ブロックデバイスではなくファイルやディレクトリを暗号化する。 カーネルモードで動作し、各ファイルのヘッダに暗号化メタデータを持つことにより、ホスト間で暗号化ファイルをやり取りすることができる。 特にUbuntuにおけるホームディレクトリの暗号化の仕組みとして広く利用されている。

またecryptfsdと呼ばれるデーモンによって制御が行われ、ecryptfs-*コマンドで各種操作を行う。

ENcFS

ファイルの暗号化のシステムとして、eCryptfsのほかにEncFS(Encrypted Filesystem)が知られている。

歴史はeCryptfsよりも古く、暗号化ファイルシステムとしては最も扱いやすいファイルシステムと言われている。FUSE(Filesystem in Userspace:カーネルを弄ることなくユーザ空間でファイルシステムを作成するソフトウェア)を用いているため制約もありますが、GUIや、WindowsやMacなどのOSもサポートされているのが特徴である。

6.4.3. dm-crypt

dm-cryptはブロックデバイスの暗号化を行うコマンド。 dm-cryptを扱うためのツールには以下の2つがある。

  • cryptsetup … 暗号化デバイスの作成・管理・各種操作
  • cryptmount … 暗号化ファイルシステムのマウント・アンマウントなど

cryptsetupコマンド

暗号化ファイルシステム利用を行うコマンド。

cryptsetup <アクション> <アクションごとのオプション>
アクション【plainモード】説明
open –type plain デバイス名 名称マッピング名とデバイスを指定して暗号化マッピングの作成
close 名前 / remove 名前暗号化マッピングの削除
resize 名前暗号化マッピングのサイズ変更
status 名前暗号化マッピングの状態表示
アクション【LUKSモード】説明
luksFormat デバイス名デバイスをLUKSパーティションとして初期化
luksOpen デバイス名 名前デバイスとLUKSパーティション名を指定しLUKSパーティションを開く
luksClose 名前Luksパーティションを閉じる
luksAddkey デバイス名 キーファイル名LUKSパーティションにパスフレーズを追加
luksKillSlot デバイス名 キースロット番号
luksDelKey デバイス名 キースロット番号
LUKSパーティションから設定したパスフレーズを削除
luksDump デバイス名LUKSパーティションの状態表示
isLuks デバイス名デバイスがLUKSパーティションの場合は真をそうでない場合は偽を返す

cryptmountコマンド

cryptmount [オプション] [ターゲット]
オプション説明
-mターゲットのマウント
-uターゲットのアンマウント
-Sターゲットのマウント状況の表示
-l利用可能なターゲットの基本情報の表示
-sターゲットのスワップ領域の有効化
-xターゲットのスワップ領域の無効化
-pターゲットに対するデバイスの準備
-rターゲットから全デバイスの開放
-cターゲットのパスワード変更
-g復号キーの作成

cryptsetupによる暗号化デバイスの利用方法

cryptsetupを用いて暗号化デバイス(パーティション)を利用する流れは以下の通り

  1. (LUKSモード利用時)luksFormatによるパーティションの初期化
    • cryptsetup luksFormal /dev/sdb2
  2. openまたはluksOpenによる暗号化マッピングの作成
    • cryptsetup open --type plain /devsdb1 dm01
    • cryptsetup luksOpen /dev/sdb2 dm02
  3. mkfsおよびパーティションのマウント
    • mkfs.ext4 /dev/mapper/dm02
    • mount /dev/mapper/dm02 /mnt/luks

なお利用終了時は、アンマウントし暗号化マッピングを削除する。

  1. パーティションのアンマウント
    • unmount /mnt/luks
  2. closeまたはluksCloseによる暗号化マッピングの削除
    • cryptsetup close dm01
    • cryptsetup luksClose dm02

6.4.4. eCryptfs

eCryptfsはファイルシステムの暗号化を行う技術の一つで、ファイルやディレクトリを暗号化することができるもの。 擬似ファイルシステムとも呼ばれ、マウントすることでeCryptfs層を通過させることにより復号を行う。

カーネルモードで動作し、各ファイルのヘッダに暗号化メタデータを持つことにより、ホスト間で暗号化ファイルをやり取りすることができる。 特にUbuntuにおけるホームディレクトリの暗号化の仕組みとして広く利用されている。 またecryptfsdと呼ばれるデーモンによって制御が行われ、ecryptfs-*コマンドで各種操作を行う。

ecryptfsコマンド

ecryptfsコマンドはecryptfsの操作を行うコマンド。 mount.ecryptfs, umount.ecryptfsでも操作をおこ会う。

オプション説明
ecryptfs-setup-private暗号化ディレクトリのセットアップ
ecryptfs-migrate-homeユーザディレクトリの暗号化
ecryptfs-mount-private暗号化ディレクトリのマウント
ecryptfs-umount-private暗号化ディレクトリのアンマウント
ecryptfs-unwrap-passphraseパスフレーズの複合
# eCryptfsのセットアップを行う
ecryptfs-setup-private

# 暗号化ディレクトリのマウント、アンマウントを行う
ecryptfs-mount-private
ecryptfs-umount-private

# rootユーザが、一般ユーザのホームディレクトリ全体を暗号化するコマンド
ecryptfs-migrate-home

# 「wrapped-passphrase」を復号する
ecryptfs-unwrap-passphrase

なおファイルのマウントはmount -t encryptfsコマンドでも可能となる。 また、マウントした状態(復号した状態)でバックアップを取ると、暗号化されていないデータもバックアップされることになるので注意する。 暗号化した状態のみにしたい場合はumountしてからバックアップを実施する。

eCryptfsのディレクトリ構造

ecryptfs-migrate-homeコマンドなどにより暗号化ディレクトリを作成すると、以下のようなファイルやディレクトリが作成される。

$HOME
  ├ Private/ ... 復号されたデータを含むマウントポイント
  ├ .ecryptfs/
  │  ├ Private.mnt ... 暗号化ディレクトリのマウントポイントが書かれたファイル
  │  ├ Private.sig ... 暗号化パスフレーズの署名ファイル
  │  ├ wrapped-passphrase ... マウント用の暗号化パスフレーズ
  │  ├ auto-mount ... 自動マウント用の空ファイル
  │  └ auto-umount ... 自動アンマウント用の空ファイル
  └ .Private/ ... 暗号化されたデータを含むディレクトリ

6.4.5. ENcFS

encfsパッケージは ecryptfs と同様の機能を提供するが、スーパーユーザー以外が使用するように設計されている

6.5. DNSと暗号化

6.5.1. DNSの概要

DNSとは

DNSはIPアドレスやその他のデータを保存し、名前によるクエリを可能にする階層型の仕組みのこと。 DNS サーバーはドメイン名のデータベースを保存し、ネットワーク内のクライアントからの DNS クエリに基づいてドメイン名を処理する。

DNSサーバの種類

DNSサーバには以下の種類がある。

  • マスタDNSサーバ(権威DNSサーバ)
    • ゾーンファイルを所有するDNSサーバ
    • A、AAAA、CNAME などのDNS名レコードを保持する
  • スレーブDNSサーバ(キャッシュDNSサーバ)
    • マスターDNSサーバのゾーン情報をコピーするDNSサーバ
    • ドメインに対する以前のクエリに基づいてキャッシュファイルを構築している

再帰問い合わせと反復問い合わせ

ドメイン名とIPアドレス対応に関する問い合わせは再帰問い合わせ(Recursive query)と反復問い合わせ(Iterative query)の2種類がある。

  • 再帰問い合わせ
    • リゾルバからの問い合わせ要求を受けたDNSサーバが、他のDNSサーバに問い合わせを行い、その最終的な結果をリゾルバに応答する必要のある問い合わせ
  • 反復問い合わせ
    • リゾルバから再帰問い合わせを受けたキャッシュDNSサーバが、再帰問い合わせの結果を返すために、答えを得られるまで繰り返し他のDNSサーバへ行う問い合わせのこと

DNSゾーン

DNS構成はゾーンリソースレコード で構成される。 ゾーンの種類は以下の通り。

  • パブリックDNSゾーン * インターネットから参照できるゾーン * パブリックゾーンに DNS レコードを作成して、インターネット上にサービスを公開できる
  • プライベートDNSゾーン * パブリックインターネット経由でクエリできないゾーンのこと
  • サブゾーン * ゾーンの所有者が NS レコードを使用してサブドメインを別のネーム サーバーに委任できるもの * example.comの場合、aaa.example.combbb.example.com作成し、親ドメインのゾーンから見つけられるようにする(委任)するもの

スプリットビューDNS(スプリットホライズンDNS)

スプリットホライズンDNSを使用すると、要求に応じて同じ名前に対して異なる回答 (異なるリソースレコードセット) を提供できる

この機能は、クエリが開発ネットワークから送信された場合はアプリの開発/ステージング バージョンを提供し、クエリがパブリックインターネットから送信された場合はアプリの運用/公開バージョンを提供するといったことに利用できる。

リソースレコード

リソースレコードはドメイン名と IP アドレスに関するデータを保存するために使用されるもの。 DNSゾーンのデータベースは、リソース レコードのコレクションで構成される。 各リソース レコードは、特定のオブジェクトに関する情報を指定する。

リソースレコードタイプ説明
SOA管理情報の記述
NSゾーンを管理するDNSサーバを記述
MXメールサーバを記述(正引きのみ)
Aホスト名に対するIPアドレスを記述(正引きのみ)
AAAAホスト名に対するIPv6アドレスを記述(正引きのみ)
CNAMEホスト名の別名に対するホスト名を記述(正引きのみ)
PTRIPアドレスに対するホスト名を記述(逆引きのみ)
TLSAデジタル署名されたレコード。サーバ認証に使われる証明書や鍵の情報がドメイン名に対して関連付けられてDANE(DNSを使った認証の仕組み)で用いられる

レコードセット

レコードセットは同じ名前と同じタイプで、データ値が異なるレコードのこと。 以下は同じ名前とタイプを持つ複数のレコードを含むレコードセットの例。

DNS名タイプTTL (秒)データ
db-01.dev.gcp.example.comA5010.128.1.35
db-01.dev.gcp.example.comA5010.128.1.10

6.5.2. ドメインレジストラ

ドメインレジストラはパブリックゾーンのインターネットドメイン名の予約を管理する組織のこと。 レジストラは汎用トップレベル ドメイン (gTLD) レジストリまたは国コード トップレベル ドメイン (ccTLD) レジストリによって認定される必要がある。

6.5.3. SOAレコードのシリアル番号

SOAレコードのシリアル番号はDNSゾーンのバージョン番号のこと。 すべてのネームサーバーがゾーンの最新のバージョンであるためには、それらのネーム サーバーが同じSOAシリアル番号を持っている必要がある。

EDNS

EDNSはDNSの拡張プロトコルEDNS(Extension mechanism for DNS)のこと。 DNSでUDPを用いる場合、パケットサイズが512byteを超えることができないという制約を緩和するためのものともいえる。 EDNS の最も一般的な実装はDNSSECである。

また、EDNSは基本的なDNSプロトコルの枠組みは残したままで512byte以上の通信を可能にする。

DOビット/ADビット

EDNSによって拡張されたDNSパケットでは、DO bitという識別情報がやりとりされる。 DO=「DNSSEC OK」bitであり、このbitを識別できることがDNSSECを使用できる前提となる。つまりENDSを理解できない場合はDNSSECを利用といえる。

またDNSSECで認証確認が成立した場合は、DNS応答のAD(Authentic Data)ビットに1が格納される。

6.5.4. BINDの保護

TSIG

TSIGはトランザクション署名とも呼ばれるDNS メッセージを保護し、安全なサーバー間通信を提供するための仕組みのこと。BIND v8.2 以降で使用できる。 DNSサーバ同士でなりすましを防ぐために認証を行う仕組みともいえる。

TSIG は2つのDNS サーバー間の次のタイプのトランザクションを保護できる。 TSIG は、共有シークレットと一方向ハッシュ関数を使用して DNS メッセージを認証する。

chroot jailによるBIND実行

chrootは指定したディレクトリを新しいルートディレクトリとしてプロセスを制限できる機能のこと。 この機能によりディレクトリ内のソフトウェアが乗っ取られても、被害をソフトウェア内だけにとどめることができる。

/etc/named.confの主要なディレクティブ

CentOSにおける設定例は以下の通り。

options {
        listen-on port 53 { 127.0.0.1; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        secroots-file   "/var/named/data/named.secroots";
        recursing-file  "/var/named/data/named.recursing";
        allow-query     { localhost; };

        recursion yes;

        dnssec-enable yes;
        dnssec-validation yes;

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";

        /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
        include "/etc/crypto-policies/back-ends/bind.config";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
        type hint;
        file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
ディレクティブ説明
allow-queryネームサーバーへのクエリを許可するホストを指定する
allow-recursion再帰クエリに適用できる。デフォルトではすべてのホストがネームサーバー上で再帰的クエリを実行できる。
allow-transferゾーンの情報の転送要求を許可するスレーブサーバーを指定する。デフォルトではすべての転送リクエストが許可される。
allow-updateゾーン内の情報を動的に更新できるホストを指定する。デフォルトでは、すべての動的更新リクエストが拒否される。

Rndc

rndc (リモート ネーム デーモン コントロール)は、BIND にてローカルホストまたはリモートホストから指定されたデーモンをコマンドラインで管理できるようにするツール。BIND 9.0以降で使用できる。

rndcは、デジタル署名された名前付きコマンドを TCP 接続経由で送信する。

rndc の設定ファイルは/etc/rndc.confとなる。 この構成ファイルには、接続するネームサーバーやデジタル署名に使用するキーなどの構成情報が保存される。

rndc ユーティリティは、初期化スクリプトを使用してnamedが開始されるときに開始される。 rndc.confファイルはrndc-confgenコマンドユーティリティを使用してランダムキーを使用して生成できる。

6.5.5. DNS関連のコマンド

digコマンド

dig(Domain Information Groper)コマンドはDNSにクエリを実行するためのコマンド。 DNS 問題の検証とトラブルシューティングに使用できる。

dig <ドメイン名>
digコマンド説明
dig google.com MXドメインの MX レコードをクエリする
dig google.com SOAドメインの SOA レコードをクエリする
dig google.com TTLドメインの TTL レコードをクエリする
dig @8.8.8.8 google.comクエリに別の DNS サーバーを使用する
digdigコマンドのバージョンとルートDNS サーバーを表示します

delvコマンド

delvコマンドはBIND 9.10以降のdigコマンドの後継ツール

delv <オプション> ドメイン名
オプション説明
+rtraceクエリされたすべてのレコードリソースをリストするだけ。DNSSEC の詳細は含まれない
+mtracertrace と同じだが、すべてのレコードリソースの完全な内容が含まれる
+vtrace多くの追加メモを含む検証プロセスの追跡

6.5.6. DNSSECによるDNSの保護

DNSSEC

DNSSECはDNSの応答にデジタル署名の機能を使って正当性を付与し、改ざんされていないこと、正当な管理者の管理しているレコードであることを保証する仕組みのこと。

DNSはもともとルートサーバから始まる名前解決の木構造で、順に権限移譲しながら最終的な名前解決に辿り着くという仕組みとなる。 この際、自己の署名に対する公開鍵を上位DNSサーバへ登録することで、信頼される権威サーバであることを担保し、これによりその応答レコードも信頼される…という信頼の連鎖によって一覧のDNSレコードの信頼性を確保する。

DNSサーバは、ドメイン情報を保持・提供する権威DNSサーバと、権威DNSサーバに問い合わせをするキャッシュDNSサーバに分かれているが、DNSSECを使用するにはそれぞれがDNSSECに対応している必要がある。

DNSSECでは2種類の鍵を用いる

  • ゾーンの署名鍵(ZSK:Zone Signing Key)… ゾーンに署名する
  • 鍵の署名鍵(KSK: Key Signing Key)… ゾーンに署名した鍵に署名する

それぞれは公開鍵と秘密鍵のペアになっている。

DNSSECを利用するためにはBINDの場合、設定ファイル/etc/named.confoptionsセクションへ以下の二つの項目を設定する必要がある。

options {
   dnssec-enable   yes; # DNSSECの有効(yes)/無効(no)を設定する
   dnssec-validation  auto; # DNSSEC検証の有効/無効を設定する (auto または yes)
# auto: DNSSEC検証を有効にし、トラストアンカー
# yes: DNSSEC検証を有効にする。トラストアンカー(trusted-key)を手動で設定する必要がある
# no : DNSSEC検証を無効にする
   :(以下省略)

これらのパラメータは、BINDのバージョンによってデフォルト値が異なる。 BINDのバージョンを確認するには、BINDサーバ上で直接named -vコマンドを実行するか、クライアントからBINDサーバへ向けて確認するには上述のdigコマンドを使用できる。

named -v

dig

セキュリティのためにバージョンを隠す場合は設定ファイル/etc/named.confoptionsセクションに以下のように記載する。

options {
    version "表示したい文字列";
    :(以下省略)

DNSのリソースレコード

DNSはIPアドレスとドメイン名とを紐づけるためのデータベースをリソースレコードと呼ばれる形で保持する。 DNSSECで使用されるリソースレコードは以下の通り。

リソースレコード説明
DSKSK公開鍵のハッシュ値を含む情報
親ゾーンに登録すると信頼の連鎖を構築する
DNSKEY公開鍵の情報
キャッシュDNSサーバが署名を検証するために公開鍵を使用する
RRSIG各リソースレコードへのデジタル署名
キャッシュDNSサーバが権威DNSサーバからの応答に対する正当性を検証するために使用
NSEC存在しないサーバへ問い合わせがあった際に不在証明のため辞書順で並べた際に次の位置するゾーン情報を示す
NSEC3NSECを改良したもの。直接のゾーン名ではなくハッシュ化されたゾーン名を示す
NSEC3PARAM権威DNSサーバがNSEC3を生成する際に必要な情報
TLSADANEにおいて用いられるレコード(ドメイン名にX.509証明書情報の紐づけ)

TLSAレコードを除き、基本的には署名を行うと署名や公開鍵を含んだレコード(ゾーンファイル)が作成される。 DNSKEYリソースレコードには上述の通りKSK・ZSKの公開鍵が含まれ、これらは各リソースレコードの検証に使用される。

BINDのDNSSEC関連ユーティリティ

DNSサーバソフトウェアであるBINDには、サーバやKSK、ZSKの生成・管理などを行うための以下のようなコマンドユーティリティがある。

コマンド機能
dnssec-keygenDNSSECのZSK/KSKを生成する
dnssec-signzoneゾーンファイルへの署名を行う(NSEC, NSEC3, RRSIG, DNSKEYなどの生成)
dnssec-settime鍵ファイルのメタデータである時間の表示/変更
dnssec-dsfromkey鍵ファイルから上位サーバに登録するDSレコード生成する
opensslTLSAレコードの検証を行う
rndcBIND 9.0以降の制御設定ツール
delvBIND 9.10以降の検証/解析ツール

6.5.7. DNSSECの設定

dnssec-keygenコマンド

dnssec-keygenはDNSSECのキーを生成することができるコマンド。

dnssec-keygen -a RSASHA256 -b 512 -n ZONE -f KSK myzone.
オプション説明
-aアルゴリズムの指定
-bキーサイズ
-nnametype
-f指定されたフラグをKEY/DNSKEYレコードのフラグフィールドに設定する

dnssec には、ゾーンに署名するための ZSK キーのペアも必要となる。

dnssec-signzoneコマンド

dnssec-signzone はゾーンに署名しゾーンの署名付きバージョンを生成するコマンド。

dnssec-signzone -o myzone. -S db.myzoneFetching ZSK 63075/RSASHA256 from key repository.

ファイル内部は以下のようになる。

; File written on Mon Apr  9 01:45:42 2018
; dnssec_signzone version 9.10.3-P4-Ubuntu
myzone.            604800    IN SOA    myzone. root.myzone. (
                    51         ; serial
                    604800     ; refresh (1 week)
                    86400      ; retry (1 day)
                    2419200    ; expire (4 weeks)
                    604800     ; minimum (1 week)
                    )
            604800    RRSIG    SOA 8 1 604800 (
                    20180509074542 20180409074542 63075 myzone.
                    eHu3B0s9AcclEMfkaXK+zUcqnhYTRXO2BBoR
                    s4z9DGxbwcTXoy8MbIACkuVOhkM6+tQ8r7pr
                    clIKoUALm4I4mQ== )

dnssec-settimeコマンド

指定されたキーの有効期間を管理するコマンド。

dnssec-dsfromkeyコマンド

特定の KSK の DS RR を生成するために使用されるコマンド。

6.5.8. DANE

DANEはDNSSECの技術を応用した認証の仕組みのこと。 DNSSECの導入により、DNSサーバの応答の正当性が検証できるようになった。

DANEで用いられるリソースレコードをTLSAレコードと呼ぶ。

TLSAレコード

TLSAレコードはTLS サーバー証明書または公開キーを、レコードが見つかったドメイン名に関連付けるために使用される。

7 - 7.ホストのセキュリティ

【LPIC303範囲】Linuxのホスト自体(OSなど)のセキュリティを上げるためのポイントを記載

7.1. ホストセキュリティの強化

7.1.1. カーネルセキュリティ

不要なソフトウェアを無効化

実行中のすべてのプログラムには、セキュリティ上の脅威が存在する可能性があるため、使用されていないサービスを無効にすることは、セキュリティ上の良い設定となる。

サービスの無効化にはsystemctlおよびchkconfigを使用することで可能。 一般的に無効化するサービスには、atd、ava hi-daemon、cups がある。

リソース使用量の制限

ユーザーはスレッド、開いているファイル、メモリなどのシステムリソースを制限することができる。

paml_limits.soモジュールを使用すると、オペレーターはハード制限およびソフト制限を通じてユーザーがアクセスできる 1 つのリソースの量を制御できる。

ulimitコマンドでもユーザーがアクセスできるリソース量を制限可能。 また恒久的な設定は/etc/security/limits.confで可能。

ulimit <オプション> 値
オプション説明
-a現在設定されている値を全て表示
-fシェルとその子によって書き込まれるファイルの最大サイズ
-t最大 CPU 時間 (秒単位)
-u1 人のユーザーが使用できるプロセスの最大数
-Tスレッドの最大数

カーネルパラメータのチューニング

sysctlコマンドは、カーネルパラメータを表示および設定できる。

# 設定の全表示
sysctl -a

# カーネルパラメータからの表示
sysctl -n

# 設定の検索
sysctl -ar [検索パターン]

procfs 

# 設定の保存
sysctl -w  <param>=<value>

# 恒久的な設定の記述ファイル
/etc/sysctl.conf

# /etc/sysctl.confからの反映(ファイルから読み込む)
sysctl -p

7.1.2. Linuxの機能

プロセス機能

特定のプロセスの機能を確認するには/procディレクトリ内のステータスファイルを確認する。

cat /proc/self/statusで現在で実行中のプロセスを、capsh --printまたは/proc/<pid>/statusで他のユーザの実行中のプロセスを確認できる。

cat /proc/1234/status | grep Cap
cat /proc/$$/status | grep Cap

上記コマンドで表示される各行は以下内容を意味する。

  • CapInh … 継承された機能
  • CapPrm … 許可される機能
  • CapEff … 有効な能力
  • CapBnd … 境界セット
  • CapAmb … アンビエント機能セット

また、実行中のプロセスの機能を確認するには、getpcapsツールの後にプロセス ID (PID) を続けて使用することでできる。

バイナリ機能

バイナリには、実行中に使用できる機能を含めることができる。 たとえば、cap_net_rawのような機能をping持つバイナリを見つけるのは非常に一般的となる。

getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep

バイナリ検索はgetcap -r / 2>/dev/nullで行える。

capsh による機能の削除

pingのCAP_NET_RAW機能を削除すると、ping ユーティリティは機能しなくなる。

capsh --drop=cap_net_raw --print -- -c "tcpdump"

バイナリ機能の削除

バイナリの機能を削除するには以下コマンドで行える。

setcap -r </path/to/binary>

7.1.3. USBGuard

USBGuard ソフトウェア は、デバイス属性に基づいた基本的なホワイトリスト機能とブラックリスト機能を実装することにより、USB デバイスに対するシステム保護を提供する。 ユーザー定義のポリシーを強制するために、USBGuard はLinux カーネルの USB デバイス認証機能を使用する。 USBGuardフレームワークは次のコンポーネントを提供する。

  • 動的対話とポリシー適用のためのプロセス間通信 (IPC) インターフェイスを備えたデーモンコンポーネント
  • 実行中のUSBGuardインスタンスと対話するためのCLI
  • USB デバイス認証ポリシーを記述するためのルール言語
  • 共有ライブラリに実装されたデーモンコンポーネントと対話するための C++ API

USBGuardの機能

# 初期ルールセットを作成する
usbguard generate-policy > /etc/usbguard/rules.conf

# USBGuard ルール セットをカスタマイズする
vi /etc/usbguard/rules.conf

# USBGuard デーモンを起動する
systemctl enable usbguard.service

# USBGuard によって認識されるすべての USB デバイスをリストする
usbguard list-devices

# デバイスがシステムと対話することを許可する
usbguard allow-device <device-num>

# デバイスを認証解除してシステムから削除する
usbguard reject-device <device-num>

# デバイスの認証を解除するだけ
usbguard block-device <device-num>

またUSBGuardでは、blockおよび拒rejectという用語を次の意味で使用する。

  • block … 現在このデバイスと通信しないようにする
  • reject … このデバイスを存在しないかのように扱う

ホワイトリスト/ブラックリストの作成

ホワイトリスト/ブラックリストはusbguard-daemon.confによりロードされ、デーモンの実行時パラメータの構成に使用される。

ホワイトリストまたはブラックリストを作成するには、/etc/usbguard/usbguard-daemon.confファイルを編集し、そのオプションを使用することで実現できる。

RedHat系におけるUSBGuard

USBGuardのデーモンはUSBGuardパブリックIPCインターフェイスを提供する。 このインターフェイスへのアクセスはRedHat系の場合、rootユーザーのみに制限されている。

アクセス制限にはIPCAccessControlFilesオプション、またはIPCAllowedUsersオプションの設定で制御できる。 なお必ずIPCAllowedGroupsオプションの設定も行う必要があり、これを行わない場合、IPCインターフェイスがすべてのローカルユーザーに公開され、USB デバイスの認証状態を操作したり、USBGuardポリシーを変更したりできるようになってしまう。

7.2.4. ASLRの管理

ASLR(Address Space Layout Randomization)はプログラムがロードされるたびに、メモリ内の異なる場所にロードされるようにする仕組みのこと。

ASLR の設定または設定解除はカーネル パラメータによって制御される。 設定すべきカーネルパラメータはkernel.randomize_va_spaceとなる。

各値毎の動作は以下の通り。

  • 0 … ALSR が無効
  • 1 … ALSR が保守モードで動作
  • 2 … ALSR が完全に機能して動作

7.2.5. NXビット

NXビットはCPUの機能で保護されたメモリ領域からの実行を防ぐことができるもの

この機能の利用により実行可能なメモリ空間を制限することできる。そのため悪意のあるプログラムによる任意のコードの実行が困難にすることが可能。

NXビットは CPUレベルの機能であるため、CPU 情報を確認して確認する必要がある。

grep -Fw nx /proc/cpuinfo

7.2.6. Exec-Shield

Exec-ShieldはNXビットの機能のない CPU をサポートするように設計された、同じ問題に対するソフトウェア手法のこと。 NXビットと同様に保護されたメモリ領域からの実行を防ぐことができる。

7.2.7. ICMPのセキュリティ設定

ICMPの無効化はカーネルパラメータのnet.ipv4.icmp_echo_ignore_all=1で設定ができる。

sysctl -w net.ipv4.icmp_echo_ignore_all=1

このICMPの無効化はICMP(ping)応答の無効化やDDoSの軽減などホストの稼働状況に関する情報漏洩を防ぐことができる。

なお、ICMPエコーブロードキャストのみ無効化させる場合はnet.ipv4.icmp_echo_ignore_broadcasts=1で可能。

7.2.8. SSH認証局

SSH公開鍵認証の問題

SSH 接続が初めて確立されると、SSH サーバーは自分自身を識別するための公開キーをユーザーに送信する。この認証スキームは「初回使用時の信頼」または TOFU と呼ばれる。

この認証スキームはホストのIP、名前、または公開キーが変更されると、ユーザ側にホストが信頼できないようなメッセージが表示される。

SSH CAベースの認証

SSHの認証で認証局を使用してサーバーとクライアントを認証する機能を利用するとクライアントに対してホストを認証でき、ホストの信頼性を検証できないという混乱を招くSSH公開鍵認証の問題を回避できる

この構成を行い場合、接続先ホストとクライアントの2台だけではなく、認証局用のCAサーバが必要となる。

7.2.9. Chroot環境

chrootは特定のユーザーおよびプロセスに対して設定される疑似的なルートファイルシステムのこと。 特徴は以下の通り。

  • 特権のないプロセスは、chroot 環境外のファイルにアクセスできない
  • chroot 環境ではハードリンクできないため、ファイル自体をコピーして配置しておく必要がある

最新のプロセス分離ではChroot環境ではなく、仮想化コンテナが使用される。

7.2.10. Spectre/Meltdown脆弱性

Spectre/Meltdown脆弱性はプロセッサまたは CPU のハードウェアの脆弱性のこと。 この脆弱性は発見されてはいるが、悪用するには非常に難しいとされている。 具体的にはIntel製のプロセッサに対する脆弱性で内容は以下の通り。

  • Spectre脆弱性 * コンピュータにインストールされているアプリケーション間の分離が破壊されるもの * 攻撃者は安全性の低いアプリケーションをだまして、オペレーティング システムのカーネル モジュールから他の安全なアプリケーションに関する情報を朗詠させられる
  • Meltdown脆弱性 * ユーザー、アプリケーション、オペレーティング システム間の分離を破壊するもの * 攻撃者は、そのプログラムや他のプログラムのメモリ位置にアクセスし、システムから機密情報を取得するプログラムを作成することができる

Linux マシンに Meltdown と Spectre に対するパッチが適用されているかどうかを確認するには以下プロジェクトのソフトウェアで可能。

git clone https://github.com/speed47/spectre-meltdown-checker.git
  1. cd spectre-meltdown-checker
  2. chmod u+x spectre-meltdown-checker.sh
  3. ./spectre-meltdown-checker.sh

7.2.11. Polkit

PolKitは特権のないユーザセッションと特権のあるシステムとの間のネゴシエーターとして機能するアプリケーションのこと。 内部的にはユーザセッションのプロセスがシステムコンテキストでアクションを実行しようとするたびにPolkitがクエリされる。

Polkitの動作はsudoなどの従来の権限承認プログラムとは異なり、rootセッション全体に権限を付与するのではなく、特定のアクションにのみ権限を付与する。

7.2.12. Grubの制御

GRUB はパスワード機能を提供し、管理者だけが対話型操作を開始できるようにすべきものといえる。 これはGrubが構成を変更したり、実行時に任意のコマンドを実行したりできる機能があるためユーザレベルの制御としては強すぎるためである。

7.2. ホストへの侵入検知

7.2.1. スレッド検出ツール

Linuxの脅威検出ツールには以下のようなものがある。

  • AIDE … ホストの改ざん・侵入検知ツール
  • OPENScap … システム監視用のRedHat系向けのツール
  • Linux Malware Detect(LMD) … 悪意のあるソフトウェアを検出するための別のツール
  • Rkhunter … ルートキットを検知/駆除ツール
  • Chkrootkit … ルートキットを検知/駆除ツール

7.2.2. AIDE

AIDEはLinux向けのファイルとディレクトリの整合性をチェックする強力なOSS侵入検知ツール。 AIDE はファイルとディレクトリの整合性をチェックするための独自のデータベースを持つ。そのファイル署名のデータベースを維持し、ファイル署名を定期的に検証する。

またAIDEは、最近変更または変更されたファイルの監視に役立つ。誰かがファイルやディレクトリを修正または変更しようとしたときに、それらを追跡できるようになっている。

/etc/aide.conf

AIDEの設定ファイルは/etc/aide.confであり、検査対象と検査内容を設定できる。

# 記述例
CONTENT_EX = sha256+ftype+p+u+g+n+acl+selinux+xattrs
検査ルール意味
pパーティション
ftypeファイル種別
iinode番号
lリンク名
nリンク数
uユーザ
gグループ
sファイルサイズ
bブロック数
m最終更新時刻
a最終アクセス時刻
c最終ステータス更新時刻
Sサイズの増分
I inode番号の変更は無視
aclアクセスコントロールリスト
selinuxSELinuxのコンテキスト
xattrs拡張ファイル属性
md5チェックサム(MD5)
sha256チェックサム(SHA256)
# 設定例
/boot/ CONTENT_EX # ルールの適用

!/etc/.*~ # etc以下の「.」ファイルは無視
=/var/log # /var/log以下のチェック
ディレクトリ/ファイルのルール説明
!<ターゲット>指定したファイル/ディレクトリを検査しない
=<ターゲット>指定したファイル/ディレクトリを検査する(下層ファイル含まず)
<ターゲット> <ルール>指定したファイルやディレクトリは以下ヘルール適用

aideコマンド

# データベースの初期化
aide --init

# データベースのチェック
aide --check

# データベースの更新
aide --update

aideの設定

システムに AIDE を実装するには、データベースを初期化する必要がある。 データベースは/var/lib/aideディレクトリに作成される。

7.2.3. OpenSCAP

OpenSCAPはSCAPのOSSで拡張構成チェックリスト記述形式(XDDCF)を利用する脆弱性/セキュリティ設定監査ツールのこと。 このツールではシステムのセキュリティ対策の設定や、脆弱性対策をどこまで行っているかなどを診断・HTMLファイルとしてレポートすることができる。

なおOpenSCAPは自動化のための言語OVAL(Open Vulnerability and Assessment Language)とセキュリティ設定のチェックリストのフォーマットであるXCCDF(The Extensible Configuration Checklist Description Format)などに対応している。

7.2.4. Maldet

MaldetはLinux Malware Detect(LMD)とも呼ばれる、マルウェア検出ツールのこと。 以下のような特徴を持つ。

  • 脅威を迅速に識別するためのMD5ファイルハッシュ検出
  • ClamAV(アンチウイルスソフトウェア)をスキャナエンジンとして統合
  • シグネチャ(マルウェア検体が持つバイトデータ)のアップデート機能
  • 脅威を安全に隔離・保存、脅威を取り除いた隔離ファイルの復元
  • マルウェアが挿入された文字列の削除を試行
  • cronによる日次のスキャン

標準ではインストールパッケージにcronスクリプトが含まれており、定期的にスキャンおよびシグネチャのアップデートが動作するよう設定されている。 動作設定は/etc/maldetect/conf.maldetで行う。

maldetコマンド

# スキャン
maldet -a
maldet --scan-all <ディレクトリ>

# レポート
maldet -e

7.2.5. ルートキットの検出

ルートキットはコンピュータへ侵入した後に、その活動や存在を隠蔽するためにシステムを改変し、侵入の形跡を隠滅してしまうソフトウェアのこと

chkrootkit

chkrootkit セキュリティスキャナは、システムが「ルートキット」に感染している兆候を検索できる。なおchkrootkitはrootkitを検出しても自動的に対処してくれるわけではないため、検出後は手動で処理する必要がある。

# ルートキットのチェック
chkrootkit

# ルートキットのチェック(冗長出力OFF)
chkrootkit -q

rkhunter

rkhunterはルートキット検知ツールで、マルウェア対策ソフトのように、定義データベースをアップデートすることで最新のrootkitに対応することができる。 設定ファイルは/etc/rkhunter.confとなる。

# 更新
rkhunter --update

# 保持されたデータファイルを現在値で更新
rkhunter --propupd

7.2.6. Auditdによるシステム監査

ログ監査システムはシステムによって保存場所やソフトウェアが異なる。 以下は通常のOS以上のログファイルを扱うプログラムである。

  • syslog … /var/logにログを保存
  • systemd-journald

LinuxのOSシステム監査にはAuditシステムが使用される。 auditdというデーモンによって、ファイルアクセスやシステムコールの監視、ユーザの特定の操作、セキュリティイベントの記録、ネットワークアクセスの監視など、様々なイベントを監視することができる。

監査の構成と記録

Auditにおいて、監査のログ(Auditログ)や監査のルールを設定するには以下のファイルやauditctlコマンドを用いる。

  • /etc/audit/auditd.conf … Auditログ全般の設定(ログファイルやローテーションの頻度など)
  • /etc/audit/audit.rules … Auditルールを設定(永続的な設定)
  • auditctlコマンド … Auditルールを設定(一時的)

なお、これらルールによる監査の結果は、デフォルトでは/var/log/audit/audit.logへ出力される。

Auditルール

audit.rulesauditctlコマンドで設定するAuditルールには、以下の3つがある。

  • 制御ルール … Auditルールの動作設定
  • システムコールルール … システムコールの呼び出し
  • ファイルシステムルール … 特定ファイル/ディクトリへのアクセス

auditctlコマンド

auditctlはAuditシステムのカーネルコンポーネントを制御し、Auditシステムの設定やパラメータ設定が行えるコマンド

auditctl <オプション>

# ファイルシステムルールの設定オプション
audtictl -w <パス> -p <パーミッション> -k <キーワード>

# システムコールルールの設定ぷしょん
auditctl -a <リスト,アクション> -S <システムコール名> -F <フィールド> -k <キーワード>
制御ルールのオプション説明
-b <値>Auditバッファの最大値
-e [0,1,2]監査設定(0:無効,1:有効,2:ロック)
-f [0,1,2]深刻なエラー時の挙動(0:何もなし,1:printkへ出力,2:カーネルパニック)
-r <メッセージ数>1秒あたりのメッセージ上限
-D全ルールの削除
-l現在の設定のリスト表示
-sAuditシステムのステータス表示
ファイルシステムルールに関するオプション説明
-w <パス>監査対象のファイル/ディレクトリ
-p <パーミッション>ログに記録するパーミッション設定(r:読み取り,w:書き込み,x:実行, a:属性変更)
-k <キーワード>ログエントリ参照時のキーワード
システムコールに関するオプション説明
-a [リスト, アクションリスト]リストおよびアクションの追加
-d <リスト,アクション>リスト/アクションの削除
-S <システムコール名>システムコール名または番号(全監視はall)
-F =アーキテクチャ/ユーザIDの条件に基づいてイベント照合する際の追加オプションを指定
-k <キーワード>ログエントリ参照時のキーワード
システムコールルールのアクション説明
always常に監査ログを記録
never監査ログの作成を行わない
システムコールルールのリスト説明
exclude特定イベントの除外
exitシステムコールの終了時
taskプロセス生成,プロセスコピー時
userアプリケーションイベントの対象にする

なお、システムコールの番号はusr/include/asm/unisted_64.hの参照、またはausyscallコマンドにより調べることができる。

その他のAuditユーティリティ

# Auditログファイル内のイベント検索
ausearch

# Auditログファイルに記録されたイベントについてサマリー/レポートの作成
aureport

# プログラム終了までシステム コールとプロセスを追跡できるコマンド
autrace

TTY入力の監視

各ユーザのTTY入力の監視の有効化はpam_tty_audit.soの設定を行う。 この設定によりユーザがどのコマンドを実行したかログに記録できる。

監査の有効化は/etc/pam.d/password-auth/etc/pam.d/system-auth陛下のように定義する。

# rootのみ、TTY入力の監査を有効にする
session required pam_tty_audit.so diable=* enable=root

なお、結果はaureport --ttyで参照できる。

7.3. リソース制御

LinuxOSにはユーザが使用できるシステムリソース量を制限できる機能があり、制限にはulimitコマンドを用いる。

7.3.1. ulimitコマンド

シェルやシェルにより開始されるプロセスが使用できるリソースを制限できるコマンド。

ulimit -a

/etc/security/limits.conf

再起動時にulimitの設定を維持するには、/etc/security/limits.confでシステム全体に制限をかける必要がある。

なお制限方法は以下の2種類がある。

  • ソフトリミット … 現在有効なユーザーの利用可能なリソースの制限
  • ハードリミット … 実際の最大制限

7.3.2. pam_limits.so

pam_limits.soモジュールはユーザセッションで取得できるシステムリソースに制限を設定できるもの。

なおuid=0のユーザも影響を受ける。 またデフォルトに制限は構成ファイル/etc/security/limits.conf、次にディレクトリ/etc/security/limit.dの各ファイルが読み取られる。

7.3.3. Cgroup

CgroupはRedHat系の機能でシステム上で実行されているユーザー定義のタスク (プロセス) グループ間で、CPU 時間、システム、メモリ、ネットワーク帯域幅、またはこれらのリソースの組み合わせなどのリソースを割り当てることができる仕組みのこと。

一言で言うとカーネル内の特定のサブシステムを制御するためのメカニズムといえる。

Cgroups V1(RHEL8以前)の仕組み

CgroupsはKubernetes、Docker等のコンテナ技術でも使用されている。 Cgroupにおいてデバイス、CPU,メモリ(RAM)、ネットワークアクセスなどのサブシステムはコントローラと呼ぶ。

コントローラのタイプ(Cpu,blkio,memoryなど)はツリー上に細分化され、各枝や葉には独自の重み/制限がある。 コントローラのグループは複数のプロセスが関連付けられているため、リソースしよるいつが細かくなっており微調整が容易となっている。

Cgropus

cgroup はリソースタイプごとに作成され、相互に関連付けはない。 つまり、すべてのコントローラにグループを関連付けることはできるが、グループは独立して扱われる

/proc/cgroups

コンピュータ上で有効なコントロールグループが確認できる。

cat /proc/cgroups

/sys/fs/group

sysfs経由でも確認できる。

ls -l  /sys/fs/group

コントロールグループに関する情報の取得

systemd-cglsコマンドで制御グループの階層を表示ができるsystemd-cgtopコマンドではのリソース消費をリアルタイムで監視できる

systemd-cgls

systemd-cgtop

8 - 8.アクセス制御

【LPIC303範囲】LinuxのACLや権限設定、SELinuxなどに関する説明

8.1. 任意アクセス制御

任意アクセス制御はDACとも呼ばれ、アクセス制御リスト(ACL)を用いて実装できる。

8.1.1. 基本的なシステム権限設定

chmodコマンド

ファイルのアクセス許可を変更するために使用できるコマンド。

詳細はコチラから。

suid/guid

Linux権限システムでは、SUIDでユーザIDベースの、GUIDでグループIDベースのアクセスモードが提供されている。

プログラムにSUIDアクセスモード(u+s)で設定されている場合、そのファイルの所有者によりプロセスが開始されたように見える。

またプログラムにGUIDアクセスモード(g+s)で設定されている場合、プログラムはファイルのグループに属しているように実行される。

詳細はコチラから。

スティッキービット

ディレクトリにスティッキービット(o+t)を設定すると、ファイルの削除またはリンク解除を所有ユーザーまたはrootのみに許可できる

詳細はコチラから。

chownコマンド

rootユーザが使用できるコマンドでファイルの所有権を変更できるコマンド

詳細はコチラから。

拡張属性

拡張属性(xattr)はファイルシステム内のファイルまたはディレクトリに追加データを追加するメカニズムで、ext2、ext3、ext4、jfs、xfs、reiserfs、btrfs などの多くのファイル システムがサポートしている。

拡張ファイル属性は、ファイル システム、データ管理 API などの他のミドルウェア、オペレーティング システム、またはユーザーによってプログラム的に設定できるキーと値のペアのこと。

拡張属性の名前は、次の拡張属性名のように、名前空間名、ドット、属性名で構成される。

user.swift.metadata

system.posix_acl_access

パブリックの名前空間は以下の通り。

  • user … 名前や内容の制限なし名前空間
  • Trusted … 通常のプロセスがアクセスできない拡張属性に情報を保持するメカニズムをユーザー空間に実装するために使用される
  • security … SELinux によって使用される
  • system … 主にカーネルによってアクセス制御リスト (ACL) 用に使用される

getgfattr/setfattrコマンド

attrパッケージで使用できるコマンドにはgetgfattr/setfattrコマンドがある。 拡張属性の設定・確認に使用する。

# 指定されたパス内のファイルごとに、ファイル名と、そのファイルに関連付けられている拡張属性名 (およびオプションで値) のセットを表示
getfattr

# 指定されたパスの名前付き属性を返す
getfattr -n <name>
getfattr --name <name>

# 拡張属性名および値を表示
getfattr -d
getfattr --dump

# 指定されたパターンに一致する属性を持つ属性を返す
getfattr -m <pattern>

# 拡張属性の値の表示形式を指定する
getfattr -e <エンコード>
getfattr --encoding=<エンコード>
# 指定された各ファイルの拡張属性名に新しい値を関連付ける
setfattr

# 指定されたパスの名前付き属性を返す
setfattr -n <name>
setfattr --name <name>
# 指定された属性に割り当てる新しい値
setfattr -v <value>
setfattr --value <value>
# 属性を完全に削除
setfattr -x  <name>
setfattr --remove  <name>
# 指定したACLをデフォルトACLに設定
setfattr -d 
setfattr --default
# 指定したACLに設定を変更/追加
setfattr -m <権限>

8.1.2. ACLの使用

ACLは所有者以外のユーザーまたはグループに対して異なる権限であっても、特定の権限を定義する場合に使用できる。

また、ACLの使用は基本的な所有権や権限を (必然的に) 変更することなく、より具体的な権限のセットをファイルまたはディレクトリに適用できる。これにより、他のユーザーまたはグループのアクセスを追加できるようになる。

ACL権限を割り当てることができるエントリ タグは4つある。

  • user(u) … ファイル所有者または指定されたユーザ
  • group(g) … グループ所有者または指定されたグループ
  • mask(m) … ファイル所有者のユーザー エントリを除く、任意の ACL エントリによって付与できる最大アクセスを指定するエントリ
  • other(o) … ユーザーまたはグループの ACL エントリに一致しないプロセスに許可されるアクセスを指定するエントリ

設定例は以下の通り。

# ユーザー john には読み取りおよび書き込みアクセス権を与える
u:john:rw-
# グループ スタッフには読み取りアクセス権を付与
g:staff:r--
# その他のアクセスはなし
o::---

getfaclコマンド

getfaclコマンドはファイルごとにファイル アクセス制御リスト(ACL)を取得できるコマンド。 ディレクトリにデフォルト ACL がある場合は、 getfaclデフォルト ACL も表示される。

getfacl <ファイル名/ディレクトリ名>
オプション説明
-a設定されているACLの表示
-dデフォルトACLを表示
-RファイルやディレクトリのACLを再帰的に表示

setfaclコマンド

setfaclコマンドはACLを設定するコマンド。構文は以下の通り。

setfacl [オプション] [アクション] ファイル

なおアクションは-mで変更、-xで削除になる。

使用例は以下の通り。

# Userにパーミッションを追加する
setfacl -m "u:user:permissions" /path/to/file

ACLのマスク設定

マスク設定を行うとすべてのユーザーに許可される最大設定に設定される。 また、マスク設定は、chmodまたは setfaclコマンドのいずれかを使用してアクセス許可を変更すると、間接的に自動的に再度更新される。

コマンド説明
setfacl -m u:lisa:r file追加のユーザーに読み取りアクセスを許可する
setfacl -m m::rx fileすべてのグループおよびすべての指定ユーザーからの書き込みアクセスを取り消す (有効な権限マスクを使用)
setfacl -x g:staff fileファイルの ACL からの名前付きグループ エントリの削除
getfacl file1setfacl –set-file=- file2
getfacl –access dirsetfacl -d -M- dir

8.2. 強制アクセス制御

8.2.1. DACとMAC

ほとんどの主流のOSのセキュリティシステムはDACと呼ばれる所有権によりセキュリティを強制する任意アクセス制御(DAC)に基づいている。 DACではユーザーがファイルを所有している場合、そのファイルに対する読み取り、書き込み、および実行のアクセス許可を設定できる。 つまりユーザの裁量でデータを制御するのがDACと呼べる。

Linuxにおいてはrootアカウントによりもたらされる危険性、具体的に言えばすべてのファイルとプロセスを制御する権限を持っているため、root アカウント、またはその権限で実行されるプロセスが侵害されると、攻撃者がシステムとそのデータを制御する可能性がある。

MAC(強制アクセス制御)はrootアカウントの必要性が制限される、または排除され、権限がユーザアカウントからシステムの所有者に移される。 MACではセキュリティポリシの適用を強制する。なおセキュリティポリシーは、システム所有者が設定し、システム管理者またはセキュリティ管理者が実装できる。 これらのポリシーが設定されると、たとえ root 権限を持っていたとしても、ユーザーはポリシーを上書きできない。そのためMACではファイルとプロセスの保護は所有者から独立しているといえる。

有名な強制アクセス制御(MAC)のシステムは以下のようなものがある。

  • SELinux
  • AppArmor
    • UbuntuやSUSE Linuxで使用されているセキュリティモジュール
    • プロファイルと呼ばれるセキュリティポリシーを使用して、アプリケーション単位のアクセス権を設定することができる
    • AppArmorはファイルパスで保持するため、ファイルシステムを選ばずに利用できるという利点がある
  • Smack
    • 設定がシンプルなセキュリティモジュール
    • カーネルモジュール、起動スクリプト、GNUセキュリティパッケージ用のパッチセット、の三つで構成される

DACとMACの処理順序

Linuxにおいてプロセスがファイルアクセスをする際、DAC => MACの順に処理される。 この際、DACとMAC両方許可されたときのみファイルアクセスに成功する。

なお、アクセス先がファイルではない場合、DACは関係なく、MACのみ処理される。 また、SELinuxでエラーが発生したときは監査ログ(/var/log/audit/audit.log)に記述される。

8.2.2. SELinux

SELinux(Security - Enhanced Linux)は管理者がシステムにアクセスできるユーザーをより詳細に制御できるようにするLinuxアーキテクチャのこと。 米国のNSAにより開発された。

SELinuxの動作

SELinuxは、システム上のアプリケーション、プロセス、ファイルのアクセス制御を定義する。 これはSELinux にアクセスできるものとできないものを指示する一連のルールであるセキュリティポリシーを使用して、ポリシーによって許可されたアクセスを強制する

アプリケーションまたはプロセスがファイルなどのオブジェクトへのアクセス要求(サブジェクトと呼ばれる)を行うとSELinux はサブジェクトとオブジェクトのアクセス許可がキャッシュされているアクセスベクターキャッシュ (AVC) を使用してチェックする。 SELinux がキャッシュされたアクセス許可に基づいてアクセスを決定できない場合、リクエストをセキュリティサーバーに送信する。 セキュリティサーバーは、アプリまたはプロセスとファイルのセキュリティコンテキストをチェックする。セキュリティコンテキストは SELinux ポリシーデータベースから適用され、その後、許可が付与または拒否される。

なおアクセス許可が拒否された場合、avc: denied/var/log.messagesに表示される。

SELinuxの機能

  • TE(Type Enforcement) * プロセスやリソースに対する操作権限を制限する * プロセスには「ドメイン」、ファイルやディレクトリなどのリソースには「タイプ」というラベルを付与することにより、細かなアクセス制御を実現する
  • ドメイン遷移 * 子プロセスを、親プロセスとは異なるドメインに遷移させる * 子プロセスを親プロセスと異なるドメインに遷移させる事により、親プロセスの持つ権限を引き継がず個別に権限を制御できる
  • RBAC(Role Based Access Control) * 従来のLinuxにおいてrootユーザが持っていた絶対的な権限を分散し、「システム管理者」や「Web管理者」といったロール(役割)をユーザに割り当てる
  • MAC(Mandatory Access Control)

SELinuxの設定

SELinux を構成するに様々な方法があるが、一般的な方法には対象を絞ったポリシーまたは**マルチレベルセキュリティ (MLS)**がある。

  • 対象を絞ったポリシー … デフォルト設定。さまざまなプロセス、タスク、サービスをカバーする
  • MLS … 通常は政府機関の機器で使用される設定

SELinuxの動作は/etc/sysconfig/selinuxファイルの確認で可能。 このファイルにはSELinuxが許容モード、強制モード、または無効のいずれであるか、またはどのポリシーがロードされることになっているかが保存される。

cat /etc/sysconfig/selinux
  • Enforcing … アクセス違反は拒否する
  • Permissive … アクセス違反は許可されるが、ログに記録する

セキュリティコンテキスト

セキュリティコンテキストの書式は以下の通り。

ユーザ識別子:ロール識別子:対応識別子[:MLS]
  • ユーザ識別子 … SELinuxユーザ
  • ロール識別子 … ユーザに割り当てるロールを表す
  • タイプ識別子 … TEで使用するドメインまたはタイプを表す
  • MLS … 情報の機密性を表す
ユーザ識別子説明
rootシステム管理者用
system_uプロセスなどを使用するユーザ用
user_u一般ユーザ用
ロール識別子説明
object_rファイルなどロールが不要なものに付与
staff_r一般ユーザが使用(sysadm_rに変更可能)
user_r一般ユーザが使用(sysadm_rに利用不可能)
sysadm_rシステム管理者が使用
system_rプロセスが使用
タイプ識別子説明
sshd_tSSH接続時に使用
sysdam_tシステム管理者が使用

セキュリティコンテキストの確認

セキュリティコンテキストの確認は以下コマンドで行える。

  • プロセス … ps Zコマンド
  • ファイル/ディレクトリ … ls -Zコマンド

SELinuxの動作モード確認

SELinuxはデフォルトで有効になっており、デフォルトモードであるEnforceモードで動作している。 確認にはsestatusコマンドで確認できる。

sestatus

またSELinuxポリシーの一部をクエリするにはseinfoコマンドで行える。

seinfo

またapolと呼ばれるGUI SELinux ポリシー分析ツールではsesinfoコマンドと同様の機能をGUIで提供する。 利用にはsetools-uiパッケージをインストールする必要がある。

SELinuxの一次的な有効化/無効化

getenforceコマンドで可能。

getenforce

またsetenforceコマンドはSELinuxのステータスを設定するコマンド。 設定できるパラメータは以下の通り。

  • Disabled … SELinuxの無効化
  • Permissive … ポリシを強制する代わりに警告表示。アクセス制限は無効。
  • Enforcing … セキュリティポリシの強制。アクセス制御が有効。
# 無効化
setenforce 0
# 有効化
setenforce 1

SELinuxの永続的な有効化/無効化

SELinuxの永続設定は/etc/selinux/configファイルの編集にて行う。 再起動後に設定が反映される。

# 有効化
SELINUX=enforcing

# 無効化
SELINUX=disabled

Bool値によるSELinuxポリシの設定

Bool値を使用すると、SELinuxポリシの作成に関する知識がなくても実行時に、SELinuxのポリシ一部を変更できる。 これはSELinuxのポリシのリロード、再コンパイルを行わずに、サービスによるNFSボリュームへのアクセス許可などの変更が可能になることを意味する。

またBool値を設定/表示するコマンドは以下の通り。

コマンド説明
getseboolコマンドはBool値をリストするコマンド
setseboolブール値を有効または無効にするコマンド

SELinuxにおけるファイルのラベル付け

SELinuxではSELinuxコンテキストと呼ばれるすべてのプロセスとファイルにセキュリティ関連の情報を表すラベルが付けられる。

確認にはls -Z <ファイル名/ディレクトリ名>で行える。

ls -Z file1
-rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1

SELinuxはユーザ(u)/ロール(r)/タイプ(t)/レベル(s0)の情報を提供する。 これらの情報はアクセス制御の決定を行うために使用される。

またSELinuxにはファイルシステムへのラベル付けを管理するためのコマンドで以下のものを提供している。

  • chcon
  • semanage fcontext
  • restorecon

SELinux関連コマンド一覧

操作系コマンド説明
getenforce現在の動作モード表示
setenforce動作モードの一時的変更
selinuxenabledSELinuxが有効か数値で返す
chconファイルやディレクトリのセキュリティコンテキストを変更
restoreconセキュリティコンテキストの復元
runcon指定されたセキュリティコンテキストでコマンドを実行
fixfilesSELinuxの設定ファイルに従いすべてのファイルにラベルを付与
setfiles指定した設定ファイルに従ってファイルにラベルを付与
sestatusSELinuxの現状を表示
seinfoSELinuxのロールやドメインなど各種情報を表示
newrole指定したロールに変更してシェルを起動
getseboolBool値で示されるポリシーの状態取得
setseboolBool値で示されるポリシーの設定
toggleseboolBool値で示されるポリシーの値変更
semanageSELinuxに関する各種操作
解析系コマンド説明
apolGUIでSELinuxポリシの分析
seauditGUIでSELinuxの監査ログを解析
seaudit-report監査ログのSELinux用カスタムレポートの作成
audit2why監査ログを解析し、アクセス拒否が発生した理由と解決方法を提示
audit2allow監査ログを解析しアクセス拒否が起きないルールを提示

chconコマンド

chconコマンドはファイル/ディレクトリのセキュリティコンテキストを変更するコマンド。 ただし、このchconコマンドで行われた変更は、ファイルシステムのラベルを変更したり、restoreconコマンドを実行したりしても保持されない。

# ファイルタイプの変更
chcon -t httpd_sys_content_t file-name
# ファイルタイプと内容の再帰的変更
chcon -R -t httpd_sys_content_t directory-name

8.2.1. SELinuxコンテキストを管理するためのツール

restoreconコマンド

ファイルの SELinux コンテキストを以前のタイプに復元するコマンド。 -vオプションで変更内容を表示する。

restorecon -v file1

fixfilesコマンド

restoreconコマンドと同じ機能を提供するコマンド。

restorecon

setfilesコマンド

SELinux ファイルのセキュリティコンテキストを設定するために使用できるコマンド。

setfiles

8.2.2. SELinuxコンテキストとロールをテストするためのツール

SELinux の一部には、Role-Based Access Control (RBAC) セキュリティモデルが実装されている。ロールは RBAC の属性となる。 SELinux ユーザーにはロールが承認され、ロールはドメインに対して承認される。 この役割はドメインと SELinux ユーザーの間の仲介者として機能する これは、権限昇格攻撃に対する脆弱性を軽減するのに役立つ。

newroleコマンド

新しいコンテキストで新しいシェルを実行するコマンド。

newrole

runco​​nコマンド

指定された SELinux コンテキストでコマンドを実行するコマンド。

runco​​n

8.2.3. 汎用的なSELinux管理コマンド

semanageコマンド

ポリシーソースの変更や再コンパイルを必要とせずに、SELinux ポリシーの特定の要素を構成するために使用されるコマンド。

semanage <引数>
引数説明
importローカルのカスタマイズをインポート
exportローカルのカスタマイズを出力
loginLinux ユーザーと SELinux 制限付きユーザーの間のログイン マッピングを管理する
userSELinux 制限付きユーザーの管理 (SELinux ユーザーの役割とレベル)
portネットワークポートタイプ定義の管理
interfaceネットワークインターフェースタイプの定義を管理する
moduleSELinux ポリシーモジュールの管理
nodenetworkノード タイプの定義を管理する
fcontextファイルコンテキストマッピング定義の管理
booleanブール値を管理して機能を選択的に有効にする
permissiveプロセスタイプ強制モードの管理
dontauditポリシー内の dontaudit ルールを無効/有効にする
ibpkeyinfiniband pkey タイプ定義の管理
ibendportInfiniband エンドポートタイプ定義の管理

semanage booleanコマンド

許可ルールのセットを有効または無効にすることができるコマンド。 これにより、異なるユースケースに対して異なるルールセットを許可することが可能になる。

ユースケースはユーザーのホーム ディレクトリのデータなどのユーザー コンテンツの読み取りを許可する必要がある Web サーバーがある場合などがある。このとき、SELinux ではデフォルトではそれができないが、semanage booleanコマンドを使用すると、その機能を有効にすることができる。

semanage boolean -l | grep httpd

semanage fcontextコマンド

アクセス制御を決定するための追加情報 (SELinux ユーザー、ロール、タイプ、レベルなど) を含むファイル コンテキスト定義を管理するために使用されるコマンド。

# 利用可能なポリシーの完全なリストを表示する
semanage fcontext -l

semanage portコマンド

カスタムポートでサービスを実行できるコマンド。

semanage port -a -t ssh_port_t -p tcp 2112

カスタムポートでサービスを実行しようとすると、サービスは失敗する。 例として、SSH デーモンを標準以外のポートで実行したいとする。このために単に sshd_config を構成すると、SELinux はこの変更が行われたことを認識しないため、SELinux がアクセスをブロックする。

8.2.4. CUIでのSELinux AVCメッセージのトラブルシューティング

SELinux がアクションを拒否すると、アクセス ベクター キャッシュ (AVC) メッセージがファイルに記録される。 保存される場所は/var/log/audit/audit.log/var/log/messagesに保存され、またそれはjournaldデーモンによって記録される。

ausearchコマンド

最近の AVC メッセージを検索し、SELinux がアクションを拒否していることを確認できるコマンド。

ausearch -m AVC,USER_AVC -ts recent

-mオプションはausearch が返す情報の種類を指定、-tsはタイムスタンプを指定する。

  • -ts recently … 過去10分間のAVCメッセージを表示
  • -ts today … 1日全体のメッセージを表示

sealertコマンド

AVC メッセージをさらに詳細に確認するコマンド。

sealert -l [メッセージID]

8.2.5. Seaudit

Seauditはログを表示し、特定の SELinux ポリシーに基づいてフィルタリングするためのGUIツール。

8.2.6. MACの代替ツール

SELinux以外のMACツールには以下のようなものがある。

  • AppArmor
    • Ubuntuで人気のMACツール
    • SELinuxよりも管理が容易
    • inode番号ではなくファイルパスにタイプを割り当てる
    • モード:EnforcementComplainの2つ
    • aa-genprofaa-logpro fコマンド(ポリシ作成に使用)がある
  • Smack
    • カーネルにコンパイルする必要がある
    • ラベルの割り当てに拡張ファイル属性を使用
    • -ZSELinux のようなフラグを使用
    • chsmackコマンドをラベル情報のクエリと設定に使用する

9 - 9.ネットワークセキュリティ

【LPIC303範囲】Radiusサーバ、Snort、iptablesによるファイヤーウォール設定、OpenVPN/WireGuardなどに関して。

9.1. ネットワークセキュリティの強化

9.1.1. Radius

Radius(Remote Authentication Dial-In User Service)は接続するユーザーとネットワーク サービスに一元的な認証、認可、アカウンティング(通称AAA)を提供するプロトコルのこと。

  • 認証(Authentication) … クライアント (ユーザー、デバイス、またはプロセス) がシステムの本物のユーザーであるかどうかを判断するプロセス
  • 認可(Authorization) … クライアントがネットワーク上で何を行うことが許可されているかを決定するプロセス
  • アカウンティング … ネットワーク上のクライアントのアクティビティを監視し、サービスのコストを計算するために必要な情報を提供するプロセス

3つの AAA プロトコルすべてを使用する必要はなく、必要なプロトコルのみを使用する。

9.1.2. FreeRADIUS

FreeRADIUSはOSSのRadius実装で最も広く使用されている RADIUS サーバのこと。 FreeRADIUSは認証サービスを提供するradiusdデーモンを提供する。

インストール

dnf install  freeradius freeradius-utils freeradius-mysql freeradius-perl

サービスの開始

systemctl enable radiusd --now

/etc/raddb/*

/etc/raddb/*以下にFreeRADIUSの設定ファイルが格納される。 代表的な設定ファイルは以下の通り。

  • radiusd.conf … FreeRADIUSのプライマリ設定ファイル。サーバーのログ記録とパフォーマンスの設定ができる
  • client.conf … クライアント構成ディレクティブ
  • proxy.conf … プロキシ半径およびrealm設定ディレクティブ
  • policy.d

Radmin

radminは実行中のサーバーの制御ソケットに接続し、それにCLIを提供するFreeRADIUSサーバー管理ツールのこと。

radmin <オプション>
オプション説明
-dデフォルトは/etc/raddb。 radmin はここでサーバー構成ファイルを検索し、制御ソケットのファイル名を定義する「listen」セクションを見つけます。
-D 辞書ディレクトリメイン辞書ディレクトリを設定する。 デフォルトは/usr/share/freeradiusとなる
-e コマンドコマンドを実行して終了する
-E実行中のコマンドをEchoする
-f ソケットファイルソケットファイル名を直接指定する
-hヘルプ情報の表示
-i 入力ファイル指定されたファイルから入力を読み取る。指定しない場合はstdin が使用される
-n 名前/raddb/radiusd.confの代わりに/raddb/name.confを読み取る

基本構成

デフォルトの構成を使用することがサーバの設定を最も破壊せずに使用できる方法といえる。 この場合、ユーザとパスワードの設定のみでよくなる。 手順は以下の通り。

  1. /etc/raddb/clients.confを編集してエントリ追加する
  2. ipaddrにクライアントIP、secretには通信の暗号化と復号化に使用される共有秘密を指定
  3. /etc/raddb/usersを編集しユーザアカウントを作成する
  4. testing Cleartext-Password := "password"のように設定
  5. サーバーをデバッグモードで起動する(radiusd -X)

なお、クライアントの設定方式は以下のようになる。

client test {
    ipaddr = 192.168.0.0/24
    secret = test_abcz
}

radtestコマンド

FreeRADIUS サーバーが動作可能になった際に、アカウントをテストできるコマンド。

radtest {username} {password} Pradius-server} {nas-port-number} {radius_secret}

使用例は以下の通り。

radtest testing mypass localhost 0 s3cre3t

radclientコマンド

radclientは任意のRADIUSパケットをRADIUSサーバに送信し応答を表示するコマンド。れは、RADIUS サーバーの設定に加えた変更をテストするために使用したり、RADIUS サーバーが稼働しているかどうかを監視したりするために使用できる。

radclient <オプション>

radlastコマンド

radlastコマンドはlastコマンドのFreeRADIUS サーバーにおけるフロントエンド。

radlast <オプション>

radwhoコマンド

radwhoコマンドは現在ログオンしているユーザーを表示するコマンド。

radwho <オプション>

9.1.3. ネットワークユーティリティ

tcpdumpコマンド

tcpdumpはシステムを通過する TCP/IP パケットなどのネットワーク トラフィックをキャプチャ、フィルタリング、分析するために使用できるコマンド。 システム管理者が Linux での接続の問題をトラブルシューティングするためのコマンドともいえる。

なおtcpdumpを用いて.pcapファイルにパケット情報を保存することもできる。

tcpdump <オプション> [条件式]
オプション説明
-i <インターフェイス>指定したインターフェイスの監視
-nホスト名ではなくIPアドレスの表示
-r <ファイル>ファイルからパケット情報を取得
-w <ファイル>パケット情報をファイルへ出力する
-s <バイト数>パケットを取り出すバイト数を指定する
-xパケット内容を16進数で表示する
-Xパケット内容を16進数とASCII文字列で表示する
-pプロミスキャスモードにしない
-mMIBモジュールを読み込む
条件式修飾子説明
host <ホスト>送信先/送信元がホストならば真
port <ポート番号>送信元/送信先がポート番号ならば真
src <送信元>
dst <送信元>
送信元/送信先の条件指定
and , or複合条件の設定

WireShark

Wireshark はパケットを分析するためのGUIツール。 Wireshark は GUI ツールだが、tshark として知られる CLI に相当するツールがある。

Wiresharkでは、条件を指定することで表示するパケットをフィルタリングすることができる。

フィルタ条件説明
host <ホスト>送信先/送信元がホストのパケットをキャプチャ
net <ネットワーク>対象のネットワークを流れるパケットをキャプチャ
[tcp/udp] port <ポート>対象プロトコルのポートが流れるパケットをキャプチャ
src/dst <送信元>送信先/送信元が送信元/送信先のパケットのみをキャプチャ
portrange A-Bポート番号A-Bの範囲のパケットをキャプチャ

条件式は以下の通り。

  • A eq B … A=B
  • A gt B … A>B
  • A ge B … A>=B
  • A lt B … A<B
  • A le B … A<=B
  • A and B … AかつB
  • A or B … AまたはB
  • not <条件式> … 条件満たさないとき
  • A[パターン] == B … パターンがBに合致でおk

Tshark

TSharkはWireSharkのCUIユーティリティ。 使用できるコマンドは以下の通り。

tshark [オプション]
オプション説明
-D有効なネットワークインターフェイス一覧表示
-i <インターフェイス>ネットワークインターフェイスを指定
-f <フィルタ条件>キャプチャするパケットフィルタ
-w <ファイル>キャプチャしたパケットをファイルへ保存
-r <ファイル>ファイルからパケット情報を読みこむ
-z <項目>項目に対する統計情報を出力
-V詳細表示

ndpmon

ndpmonはNDP(Neighbor Discovery Protocol)を監視するツール。NDPに関する状況をlogに記載したり、アラートメールを送信することも可能。

NDPはIPv6においてデータリンク層のアドレス解決を行うプロトコル。 NDPで利用されるメッセージの一つに、IPv6ルータからの応答であるルータ広告(RA:Router Advertisement)がある。RAはICMPv6を用いたグローバルIPアドレスのプレフィックスなどの情報で、悪意ある攻撃者がルータに成りすますとRAが書き換えられ不正なRAが発信される可能性がある。

ndpmonは、NDPをモニタリングすることにより、不正なRAを検出することができる。

Kismet

Kismetはワイヤレス ネットワークとデバイスの検出器、スニファー、ワードライビング ツール、および WIDS (ワイヤレス侵入検出) フレームワークのこと。

kismet_clientkismet_dronekismet_serverコマンド/ユーティリティで構成される。

aircrack_ng

aircrack_ngはWiFi ネットワークのセキュリティを評価するためのツール。 可能なことは以下の通り。

  • モニタリング … パケットのキャプチャとデータのテキスト ファイルへのエクスポートにより、サードパーティ ツールによるさらなる処理が可能
  • 攻撃 … パケットインジェクションによるリプレイ攻撃、認証解除、偽のアクセスポイントなど
  • テスト … WiFi カードとドライバーの機能を確認する (キャプチャとインジェクション)
  • クラッキング … WEP および WPA PSK (WPA 1 および 2)

Bettercap

BettercapはIEEE.802.11、BLE、IPv4、IPv6 ネットワークの偵察と MITM 攻撃用のツール。

9.1.4. ネットワークスレッド

不正ルーターによるアドバタイズメント

不正ルータによるルータ通知(アドバタイズメント)を防ぐにはカーネルを調整することで軽減できる。設定すべきファイルは以下の通り。

  • /proc/sys/net/ipv6/conf/<interface>/forwarding
  • /proc/sys/net/ipv6/conf/<interface>/accept_ra

Rouge DHCP メッセージ

DHCP スヌーピングを使用して対処できる。

9.2. ネットワーク侵入の検知

9.2.1. ネットワーク帯域監視

帯域監視は、トラフィック監視などとも呼ばれ、ネットワーク上を流れるデータ通信量を監視することを指す。

Linuxで帯域監視を行えるソフトウェアにntopCacti)がある。

Ntop(ntopng)

ntopはネットワークトラフィック(L2,L3)監視ソフトウェアで、ネットワークのステータス、UDP、TCP、DNS、HTTP、その他のプロトコルのトラフィックのプロトコルごとの分布をWebブラウザ上で確認できる。

設定ファイルは/etc/ntopng.confとなる。

ntop コマンド説明
/usr/sbin/ntop -Antop 管理者ユーザーのパスワードを設定する
ntop –set-admin-password=NewP@$$新しい管理者パスワードを設定する
ntop -P /etc/ntop -w4242 -d/etc/ntop 設定ファイルをポート番号 4242 で使用して、ntop をデーモンとして実行する。
-Wオプションは、Web ブラウザを通じて ntop にアクセスするポートを有効にする。このオプションを指定しない場合、デフォルトのポートは3000。
-dオプションを指定すると、ntop がデーモン モードで有効になる。

Cacti

Cactiは、RRDtoolと呼ばれるデータロギングとグラフィカルな描画を行う業界標準のツールを使った、WebUIを持つネットワーク監視ソフトのこと。

サーバ等の機器の動作状況をSNMP(Simple Network Management Protocol)を用いて監視できる。

RRDtool: RRDへデータを保持し、グラフを作成するOSS

9.2.2. Snort

Snortはネットワーク型IDSとして代表的なソフトウェア。 検知するパケットのルール(シグネチャ)を定義したルールファイルを参照して不正なパケットを検知する。

Snortには以下の用途で使用できる。

  • tcpdumpのようにパケットスニファとしての使用
  • パケット ロガーとしての使用
  • 本格的なIDSとしての運用

Snortのインストール

ソースからのダウンロードや、RedHatユーザはコチラからダウンロードできる。

Snortの構成

Snortの設定は/etc/snort/snort.confファイルで行う。 Debianの場合はSnort のデフォルト構成ファイル内の一部のネットワーク設定を上書きする必要がある。手順は/etc/snort/snort.debian.confを確認して行う。詳しくは公式ドキュメントより。

/etc/snort/*

ファイル説明
/etc/snort/snort.confネットワーク構成/監視するポートの定義が可能

Snortルール

Snortルールはシグネチャとは異なる検出手法でルールを作成するには、脆弱性が実際にどのように機能するかを正確に理解してルールを作成する必要がある。そのためデフォルトのルールセットを通常は用いると良い。

なおSnortルールは、/etc/snort/snort.confファイル内の行をコメント化またはコメント解除することによって有効または無効になる。 ルールは/etc/snort/rulesに保存される。

Snortルールの構文

Snortルールは、ルールヘッダルールオプションという 2 つの主要なコンポーネントで構成される。

なおルールセット(ルールファイル)に記述したシグネチャ(ルール)を変更した後は、snortプロセスを再起動することで変更が反映される。

alert ip any any -> any any (msg: "IP packet Detected";)

構成は以下の通り。

ルールアクション プロトコル IPアドレス ポート番号 <方向演算子> IPアドレス ポート番号 (ルールオプション)
  • ルールアクション
    • alert … ルールマッチしたパケットのログを記録し警告を出力する
    • log … ルールにマッチしたパケットをログに記録
    • pass … ルールにマッチしたパケットを無視
    • activate … ルールにマッチしたパケットについて警告出力し、対応するdynamicアクションの実行を行う
    • dynamic … activateアクションから呼び出され、該当パケットをログに記録
  • プロトコル
    • 検知対象(tcp, udp, icmp, ip)を記録
  • IPアドレス
    • x.x.x.xか範囲([x.x.x.x,y.y.y.y])または任意(any)で指定
  • ポート番号
    • ポート番号(x)または範囲((x,y))または任意(any)で指定
  • 方向演算子
    • ->:右側が送信先、左側が送信元となる
    • <>:左右に記載されるIP/ポートが送信先/送信元どちらでもよい
  • ルールオプション
    • 検知するパケットルールの指定
    • 未指定の場合はルールヘッダに垣外数るすべてのパケットがマッチする

snortのルールセット

Snortの主なルールセットは以下の通り。

ルールファイル説明
dos.rulesDoS攻撃を検出するためのルール
ftp.rulesFTPサービスへの攻撃を通知するためのルール
local.rulesユーザ独自のルール
scan.rulesスキャンを検知するためのルール
smtp.rulessmtpサービスへの攻撃を検知するためのルール
telnet.rulestelnetサービスへの攻撃を検知するためのルール
web-cgi.rulesWEBサーバのCGIに対する攻撃を検知するためのルール

snortコマンド

snort [オプション] <フィルタオプション>
オプション説明
-bログをtcpdump形式で記録
-c 設定ファイル設定ファイルの指定
-dアプリケーション層のデータも記録
-Dバックグラウンドで実行
-g <グループ>記録するグループの指定
-u <ユーザ>起動するユーザの指定
-i <インターフェイス>ネットワークインターフェイスの指定
-l <ディレクトリ>ログディレクトリの指定

9.2.3. OpenVASとNASL

OpenVAS(Open Vulnerability Assessment System)は、OSSの脆弱性スキャナソフトウェア。Network Vulnerability Tests(NVTs)と呼ばれる脆弱性テストを常に更新でき、最新の脆弱性情報にすばやく対応できることが強みで、CLIでもGUIでも操作できるインタフェースを持つ。

NASLはNessusやOpenVASなどの脆弱性スキャナーで使用されるセキュリティ対策用に特化したスクリプト言語のこと。NASLを使用すると、既知の脆弱性に基づいて特定の攻撃を自動化できる。

なおOpenVasの設定は/etc/openvas/以下に配置され、/etc/openvas/openvassd.confが全体における主要な動作の設定ファイルとなる。

openVASのユーティリティ

OpenVASを操作するユーティリティには以下のようなものがある。

ユーティリティ機能
openvasmdOpenVasManager: 各種操作が行える
openvasmd –rebuildデータベースの再構築を行う
openvassdスキャン処理を行う
openvas-nvt-syncNVTsを更新する
openvas-mkcertクライアントと暗号化通信を行うための証明書を発行する

ユーザの追加と削除

OpenVASではユーザごとにスキャン内容を設定することができる。 ユーザ追加/削除は以下コマンドで可能。

# 追加
openvasmd --create-user
# 削除
openvasmd --delete-user

NTSsのアップデート

openvas-nvt-syncコマンドで最新の状態にアップデートすることができる。

openvas-nvt-sync

クライアントとの通信の暗号化

OpenVASスキャナとこれを使うクライアント間の通信はSSL化される。 この際に必要な証明書はopenvas-mkcertコマンドで作成できる。

openvas-mkcert

9.3. パケットフィルタリング

9.3.1. ファイヤーウォールの基礎

ファイヤーウォールのアーキテクチャ

ファイヤーウォールのアーキテクチャにはパケットフィルタリング型ゲートウェイ型がある。

  • パケットフィルタリング型
    • 通信を細分化したパケットを監視するファイアウォール
    • 通信をパケット単位で解析し、決められたルールに基づいて通過の許否を判断する
    • アプリケーション層レベルの判断はできない
  • ゲートウェイ型
    • 内部コンピュータの代わりに通信を行うファイアウォール
    • アプリケーション型、プロキシサーバ型とも呼ばれる
    • データの細切れであるパケットの中身まで把握できる
    • アプリケーション層(FTP, HTTPなど)でのフィルタリングを行うことができる

パケットフィルタリング型ファイヤーウォール

パケットフィルタリング型には以下の2種類がある。

  • ステートレス … 個々のパケットについて、スタティックなIPアドレスおよびポート番号のみのフィルタリングを行う
  • ステートフル … 往きのパケットに基づき、戻りのパケットに対してもフィルタリングルールを適用する

9.3.2. ファイヤーウォール

Netfilter

Netfilterはカーネルモジュールであり、カーネルがインターフェイスに転送するネットワークトラフィックはすべて netfilter を通過するようになっている。 netfilterモジュールへの主要なインターフェイスはiptablesであり、Linux ファイアウォールで高度な構成を行うことができる。

iptablesは複雑であるため、ufw 、 firewalld などの他の解決策が考案された。 これらは iptables と連携して動作し、ファイアウォールの設定を簡単に行えるようにする。

Iptables

iptablesはテーブルとして動作し以下の3種類の機能を提供する。

  • Filter … パケットフィルタリングとして使用される
  • NAT … アドレス変換に使用される
  • MANGLE … パケットを特別な処理をしたい場合に使用される

各テーブルにはチェインがあり、どの種類のパケットをフィルタリングするか定義するために使用される。 以下の種類がある。

  • PREROUTING - (NAT, MANGLE) * パケットがルーティングテーブルに渡される前に処理する * 通常はパケットを別のアドレスまたはポートにリダイレクトするために使用する(DNAT)
  • INPUT - (NAT, Filter, MANGLE) * パケットがホストに到着するときに処理する * ネットワークからの着信接続や、ローカルプロセスからのローカルホストへの通信が含まれる
  • OUTPUT - (NAT, Filter, MANGLE) * ホストから発信されるパケットを処理する * ローカルホストから外部のネットワークへの接続や、ローカルプロセスからの通信が含まれる
  • FORWARD - (Filter, MANGLE) * ホストを経由して他のホストに送信されるパケットを処理する * ルーターがパケットを他のネットワークセグメントにルーティングする際に使用する
  • POSTROUTING - (NAT, MANGLE) * パケットがルーティングテーブルを通過した後に処理する * パケットが送信元または宛先の IP アドレスを変更するために使用する

チェインはルールを作成できるフィルタリングポイントであり、ルールはトラフを通過するパケットに適用される。 ルールは、パケットに対して正確に何が起こるべきかを定義するもので以下のようにターゲットを指定できる。

  • ACCEPT … パケットの許可
  • DROP … パケットをドロップする
  • REJECT … パケットを拒否し、送信者にはICMP警告メッセージを送信する
  • LOG … ログを取る
  • MASQUARATE … NATに使用される

iptablesコマンド

iptablesコマンドは、Linuxシステムでファイアウォールを構成および管理するためのコマンド。 iptablesは、パケットのフィルタリング、NAT (Network Address Translation)、パケットの転送などの機能を提供している。

iptables -A chain [-i/-o interface] [-s/-d address] -p udp --sport/--dport 80  -j TARGET

| オプション | 説明 | | -L <チェーン名> -t <テーブル名> | 指定されたチェーンおよびテーブル内のすべてのルールをリストする。チェーンまたはテーブルが指定されていない場合は、すべてを表示する。 | | -D | 特定のチェーン内のルールを番号によって削除する | | -バツ | チェーンを削除する | | -F (または –flush) | ルールのすべて (または指定されたチェーン) をフラッシュする | | -P | チェーンのデフォルトポリシーを変更する(DROPまたはACCEPTに設定可能) | | -v | 通常は、追加の出力を提供するために -F(または –flush) とともに使用される | | -n | IPアドレスとポートを数値形式で表示する |

# 現在のルールをリストする
iptables -nvL

# ポリシの作成
iptables -P INPUT DROP

# ルールの追加
iptables [-t table] {-A|-C|-D} chain rule-specification
# -A : 選択したチェーンの末尾に 1 つ以上のルールを追加
# -C : 仕様に一致するルールが選択したチェーンに存在するかどうかを確認
# -D : 選択したチェーンから 1 つ以上のルールを削除

# ルールの挿入
iptables [-t table] -I chain [ルール番号] rule-specification

# ルールの削除
iptables [-t table] -D chain ルール番号

# パケットカウンタとバイトカウンタをゼロに設定
iptables [-t table] -Z

/etc/sysconfig/iptables

/etc/sysconfig/iptablesブート時またはサービスの開始時にカーネルがパケット フィルタリング サービスを設定するために使用する情報が保存されるファイル。

  • iptables-save … iptablesルールを永続保存するためのコマンド * iptables-save > /etc/sysconfig/iptables.$(date +%d-%m-%y) * -c:パケットカウンタ及びバイトカウンタの現在値を表示 * -t テーブル:テーブルを指定
  • iptables-restore … バックアップの設定からiptablesの設定を復元するコマンド * iptables-restore < /etc/sysconfig/iptables.20-09-22 * -c:パケットカウンタ及びバイトカウンタの値を復元 * -n:復元する際に現在のテーブル内容を削除しない

iptablesによるIP毎の接続制限

connlimitジュールを使用すると、クライアントIP アドレス (またはアドレス ブロック) ごとにサーバーへの並列 TCP 接続の数を制限できる。 これは、サーバ または VPS をフラッディング、スパム、Webスクレイピングから保護するのに役立つといえる。

iptables -A INPUT -p tcp --syn --dport $port -m connlimit --connlimit-above N -j REJECT --reject-with tcp-reset

例は以下の通り。

# クライアントホストごとに3つのSSH接続のみを許可する
iptables  -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

# IP/ホストごとに20個のHTTP接続までに制限する
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset

iptablesによる1秒あたりの接続数制限

staterecentモジュールを使用すると、1秒あたりの接続数制限ができる。

ip6tables

Ip6tables は IPv6 パケット フィルタ ルールのテーブルの設定、維持、および検査に使用される。

9.3.3. 高度なファイアウォール

IPset

IPsetはIPアドレス、ネットワーク範囲、MACアドレス、ポート番号、およびネットワークインターフェイス名の保存されたコレクションであり、 iptablesツールは、IPセットを利用して、より効率的なルール照合を行うことができる。netfilterと連携して使用できる。

利用例としては悪意のある通信元が分かっているアドレスがあるときに、IPセットを作成しiptablesで参照することでルール セットが動的になり、構成が容易になる。

ipsetコマンド

ipsetコマンドはIP セットを作成および変更できるコマンド。

ipset <オプション>

range_setは名称、hashは保存方法、netはデータ型を定義する。

ipset create <range_set> <hash:net>

オプションは以下の通り。

オプション説明
create新しいIPセットを作成
addIPセットにエントリを追加
delIPセットからエントリを削除
destroyIPセットを破棄
listIPセットの内容をリスト
flushIPセット内のすべてのエントリを削除
test指定したIPがIPセットに含まれているかどうかを確認
swap2つのIPセットの内容を交換
renameIPセットの名前を変更

ipsetの永続化

作成した ipset はメモリに保存され、再起動すると消去される。 ipset を永続的にするには以下コマンドで可能。

ipset save > /etc/ipset.conf

復元には以下コマンド。

ipset restore < /etc/ipset.conf

DMZネットワーク

DMZは組織の内部ローカル エリア ネットワークを信頼できないトラフィックから保護し、セキュリティ層を追加する境界ネットワークのこと。 通常DMZはパブリックインターネットとプライベートネットワークの間にあるサブネットワークを指す

DMZを設置する目的は以下の通り。

  • プライベートネットワークや LAN の安全性を確保しながら、インターネットなどの信頼できないネットワークにアクセスできるようにする
  • 外部向けのサービスとリソースに加え、DNS、ファイル転送プロトコル (FTP)、メール、プロキシ、VoIP、および Web サーバーのサーバーを DMZ に設置する

DMZを置くことでハッカーがインターネット経由で組織のデータや内部サーバーに直接アクセスすることがより困難になる

Connection Tracking

ConntrackはLinux カーネルのネットワークスタックの中核機能の1つでカーネルはすべての論理ネットワーク接続またはフローを追跡でき、各フローを構成するすべてのパケットを識別して、それらを一貫して一緒に処理できる機能のこと。

Conntrackは通常、フロー内の最初のパケットのみが完全なネットワークスタック処理を通過して処理を決定する必要があるため、パフォーマンスを向上させる (CPU の削減とパケット遅延の削減)。 設定ファイルは/proc/sys/net/nf_conntrack_maxとなる。

またconntrack-toolsパッケージには 2 つのプログラムが含まれている。

  • conntrack * 接続追跡システムと対話するためのフル機能のコマンド ライン ユーティリティを提供する * 既存のフロー エントリを一覧表示、更新、削除できる
  • conntackd * ユーザー空間の接続追跡デーモン * ユーザスペースで動作する

NAT

NATは送信元と宛先の IP アドレスとポートを変更すること。 アドレス変換により、IPv4 パブリック アドレスの必要性が減り、プライベート ネットワーク アドレス範囲が隠蔽される。 このプロセスは通常、ルーターまたはファイアウォールによって実行される。

  • SNAT * ソースのプライベート IP アドレスをパブリック IP アドレスに変換するプロセスのこと
  • DNAT * パケットの IP ヘッダー内の宛先アドレスを変更すること * インターネット ホストからプライベート ホストにトラフィックをリダイレクトするために使用される

NATにおけるアドレス変換には以下の種類がある。

  • 静的NAT … 1 つのプライベート IP アドレスをパブリック IP アドレスに変換する
  • ダイナミックNAT … プライベート IP アドレスはパブリック IP アドレスのプールにマッピングする
  • NPAT(PAT) … 1 つのパブリック IP アドレスがすべての内部デバイスに使用されますが、各プライベート IP アドレスには異なるポートが割り当てられる

ebtables

ebtablesはイーサネットフレームを検査するルールのテーブル (Linux カーネル内) を設定および維持するために使用されるプログラムのこと。 ebtablesでは、iptablesと同様に「テーブル」「チェイン」「ターゲット」を用いてルールを構築する。

ebtables -Ln # ルール セットを印刷するときに行番号をリスト
ebtables -Lc # 各ルールのパケットおよびバイトカウンターをリスト

またebtablesのテーブルには以下の3種類がある。

  • filter … Ethernetテーブルのフィルタリング
  • nat … MACアドレスの変更
  • broute … ブリッジ+ルータの機能を実行

Nftables

nftables(ntf)は iptables の代替ツール。 テーブルやチェインなどが予め用意されていたiptablesに対して、nftではユーザが自分で作成する。

ルール作成の手順は以下の通り

  1. テーブル作成 … nft add table
  2. チェインの作成 … nft add chain
  3. ルールの作成 … nft add rule

ルールセットの確認はnft list rulesetで可能。

9.4. VPN

9.4.1. OpenVPN

OpenVPNは安全なポイントツーポイント接続またはサイト間接続を作成する仮想プライベート ネットワーク (VPN) 技術を実装するOSSソフトウェア。

OpenVPN は、事前共有秘密キー、証明書、ユーザー名/パスワードなどのさまざまな方法を使用して、クライアントがサーバーに対して認証できるようにする。

なおデフォルトではOpenVPNは1194のUDPポートで動作する。

OpenVPNのインストール

ダウンロードする前にIP転送を有効にする必要がある。

sysctl -w net.ipv4.ip_forward=1

RedHat系では以下のようにインストールする。

dnf install epel-release -y
dnf install openvpn -y

Easy-RSAの構成

OpenVPNのインストール後、SSL証明書を追加して構築する必要がある。

cd /etc/openvpn/
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz
tar -xvzf EasyRSA-unix-v3.0.6.tgz
mv EasyRSA-v3.0.6 easy-rsa
cd /etc/openvpn/easy-rsa
vi vars

easy-rsaのvarsを作成したら以下ステップを実行する

  1. ./easyrsa init-pkiでpkiディレクトリの開始
  2. sudo ./easyrsa build-caでCA証明書の作成
  3. sudo ./easyrsa gen-req myov-server nopassでキーペアと証明書のリクエストを作成
  4. sudo ./easyrsa sign-req server myov-serverでサーバキーに署名する
  5. sudo ./easyrsa gen-dhでキー交換のためのDH鍵を作成する
  6. 上記で作成したファイルを/etc/openvpn/server/にコピーする(ca.crt,dh.pem, .key, .crt)
  7. sudo ./easyrsa gen-req client nopassでクライアント キーを取得する
  8. sudo ./easyrsa sign-req client clientで生成された CA 証明書を使用してクライアント キーに署名する
  9. 上記で生成したファイルを/etc/openvpn/client/にコピーする(ca.crt,client.crt,client.key)

OpenVPNサーバの構築

/etc/openvpn/server/server.confにEasy-RSAの構成で構成したファイルをもとに設定ファイルを以下のように記述する。

なお設定は0から作成する必要はなく、/usr/share/doc/openvpn-/sample/sample-config-files/server.confに設定ファイルの散歩ウルがあるためそれを利用すると良い。

port 1194
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/myov-server.crt
key /etc/openvpn/server/myov-server.key
dh /etc/openvpn/server/dh.pem
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
duplicate-cn
cipher AES-256-CBC
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
auth SHA512
auth-nocache
keepalive 20 60
persist-key
persist-tun
compress lz4
daemon
user nobody
group nobody
log-append /var/log/openvpn.log
verb 3

OpenVPNサービスの有効化

以下コマンドを使用してサーバーを起動し、有効にする。

systemctl start openvpn-server@server

なおこのコマンドにより、正常にVPNサーバが起動すると新しいネットワーク インターフェイスtun0が作成される。

クライアント構成ファイルの生成

OpenVPNクライアント構成ファイルを生成するには以下.ovpnファイルを作成することで可能。ファイル内容は以下のように記述する。

サンプルファイルは/usr/share/doc/openvpn-/sample/sample-config-files/client.confに存在するためこのファイルの改造で可能となる。

client
dev tun
proto udp
remote vpn-server-ip 1194
ca ca.crt
cert client.crt
key client.key
cipher AES-256-CBC
auth SHA512
auth-nocache
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
resolv-retry infinite
compress lz4
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3

ルーティングの構成

以下コマンドでOpenVPNサービスの通信がファイヤーウォールを通過できるようにできる。

firewall-cmd --permanent --add-service=openvpn
firewall-cmd --permanent --zone=trusted --add-service=openvpn
firewall-cmd --permanent --zone=trusted --add-interface=tun0
firewall-cmd --add-masquerade
firewall-cmd --permanent --add-masquerade

VPN からの受信トラフィックをローカル ネットワークに転送するようにルーティングを設定するには以下の通り。

routecnf=$(ip route get 8.8.8.8 | awk 'NR==1 {print $(NF-2)}')
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $routecnf -j MASQUERADE

変更の有効化/再読み込みはfirewall-cmd --reloadで可能。

クライアントマシンにOpenVPNをインストールする

インストールする

dnf install epel-release -y
dnf install openvpn -y

サーバからクライアント構成をコピー

sudo scp -r root@vpn-server-ip:/etc/openvpn/client .

OpenVPNサーバに接続する。

cd client/
openvpn --config client.ovpn

OpenVPNコマンド

openVPNを操作するユーティリティ

openvpn <オプション>

9.4.2. IPSecサーバとクライアント操作

IPsec

IPsecは保護されたネットワークと保護されていないネットワークの間に境界を作成する。境界を通過するトラフィックは、IPSec 構成を担当するユーザーまたは管理者によって指定されたアクセス制御の対象になる。

IKE: RFC 7296 で定義されている IKE は、2 つのシステムまたはデバイスが信頼されていないネットワーク上で安全な通信チャネルを確立できるようにするプロトコル。 このプロトコルは、一連のキー交換を使用して、クライアントとサーバーの間に暗号化されたトラフィックを送信できる安全なトンネルを作成する

IPsecのポリシー

IPSecりよるサービスは2つのデータベースによって定義される。 1つが**SPD(Security Policy Database)SAD(Security Association Database)**のこと。このポリシは送信元から宛先に送信される各 IP パケットに適用される。

セキュリティアソシエーション

セキュリティアソシエーションは両方のノードが認証および暗号化メカニズムに関する情報を交換するための概念で、送信者と受信者の間で伝送されるトラフィックにセキュリティ サービスを提供する。

IPsec

IPsecのアーキテクチャではセキュリティアソシエーションを識別するパラメータは3つある。

  1. SPI(Security Parameter Index)、受信側システムが受信パケットを選択するためのIPSecプロトコルヘッダを伝えるビット文字列
  2. IP宛先アドレス、IPSecのエンドポイントアドレス
  3. セキュリティプロトコル識別子

SAD(Security Association Database)

SPD(Security Policy Database)

IPSecプロトコル

IPSecではAH(プロトコル認証ヘッダ)、ESP(カプセル化セキュリティペイロード)の2つのプロトコルを使用してトラフィックセキュリティサービスを提供する。

  • プロトコル認証ヘッダ (AH) * IP ヘッダーとデータ ペイロードがハッシュされるために使用 * ハッシュから新しい AH ヘッダーが構築され、パケットに追加される * 認証機能と未改竄の保証
  • セキュリティペイロードのカプセル化 (ESP) * データ パケットの暗号化と整合性を提供するセキュリティ プロトコル * 標準 IP ヘッダーの後に追加される * AHの機能+暗号化

IPSec暗号化の技術

IPSecのセキュリティアソシエーションではトンネルモードトランスポートモードの2つのモードの操作を設定できる。

  • トンネルモード * ペイロードとヘッダーの両方が暗号化される * ゲートウェイ間、またはエンド ステーションからゲートウェイへの使用が一般的 * パケットの送信元がセキュリティを提供するデバイスと異なる場合は、トンネル モードが使用
  • トランスポートモード * 各パケットのデータ部分のみが暗号化される * エンド ステーション間、またはエンド ステーションとゲートウェイの間に適用できる

IPsec画像

IPSecのトラフィック処理

Racoon

RacoonはIPsec IKE プロトコルのキー交換デーモンのこと。 設定ファイルは/etc/racoon/racoon.confとなる。

setkey

setkeyはIPsecにおける二つのデータベース(SAD、SPD)を操作するためのユーティリティ

ipsec-tools

ipsec-toolsはIPsec接続を確立するために必要なユーティリティ。 なお現在はRedHat系OSではIPsec-toolsは使用されておらず、LibreSwanといったツールでVPNが構成されている。

設定ファイルは/etc/ipsec-tools.confとなる。

9.4.3. StrongSwan

StrongSwan はIPsec ベースのOSSのVPN。 StrongSwan は元々 Linux 用に設計されたが、その後 Android、FreeBSD、Mac OS X、Windows およびその他のプラットフォームに移植された。特徴は以下の通り。

  1. 構成がシンプル
  2. 強力な暗号化と認証方法の提供
  3. 大規模で複雑なVPNネットワークをサポートする
  4. 拡張性に優れたモジュラー設計

StrongSwanのインストール

dnf install -y epel-release
dnf install -y strongswan.x86_64

strongsan.conf

strongswanの設定ファイル。

# strongswan.conf - strongSwan configuration file
#
# Refer to the strongswan.conf(5) manpage for details
#
# Configuration changes should be made in the included files

charon {
        load_modular = yes
        plugins {
                include strongswan.d/charon/*.conf
        }
}

include strongswan.d/*.conf 

swanctl

swanctlはインターフェイス プラグインを介して StrongSwan IKE デーモン ( charon )を設定、制御、監視するためのコマンドライン。

swanctl <オプション>

swanctl.conf

9.4.4. WireGuard

WireGuardは非常にシンプルで高速な最新の VPN 。 OpenVPN よりも大幅にパフォーマンスが向上している。

Wireguardのインストール

sudo dnf install elrepo-release epel-release -y
sudo dnf install kmod-wireguard wireguard-tools -y

Wireguard サーバの構成

適切な権限を持つ Wireguard 設定用の空の構成ファイルをサーバー上に作成する。

mkdir /etc/wireguard

ディレクトリを作成した後、wgおよび``tee`コマンドライン ツールを使用して公開キーと秘密キーを作成する。

wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey

次に、VPN トラフィックをルーティングするためにトンネル デバイスを設定する必要があり、/etc/wireguard以下にwg0.conf等を作成する必要がある。

[Interface]

## IP Address of VPN server ##
Address = 192.168.108.101/24

## Save the configuration when a new client will add ##
SaveConfig = true

## port number of VPN server ##
ListenPort = 51820

## Private Key of VPN Server ##
PrivateKey = SERVER_PRIVATE_KEY

## Command to be executed before starting the interface ##
PostUp     = firewall-cmd --zone=public --add-port 51820/udp && firewall-cmd --zone=public --add-masquerade

## Command to be executed before turning off the interface ##
PostDown   = firewall-cmd --remove-port 51820/udp --zone=public && firewall-cmd --remove-masquerade --zone=public

インターフェイスはsudo wg-quick up wg0コマンドで起動する。 またsudo systemctl enable wg-quick@wg0で有効化できる。

wgコマンド

wgはWireGuard トンネル インターフェイスの構成を取得および設定するための構成ユーティリティ。 インターフェイス自体は を使用して追加および削除でき、その IP アドレスとルーティング テーブルはと をip-link(8)使用して設定できる。

wg <サブコマンド>
サブコマンド説明
show現在の構成とデバイス情報を表示する
showconf指定された WireGuard インターフェイスの現在の設定を表示する
set現在の構成の変更、ピアの追加、ピアの削除、またはピアの変更

IPv4転送の有効化

NATのIPv4転送の有効化には/etc/sysctl.d99-custom.confを作成する。

## for enabling IPv4 forwarding ##
net.ipv4.ip_forward = 1

## for enabling IPv6 forwarding ##
#net.ipv6.conf.all.forwarding = 1
sysctl -p /etc/sysctl.d/99-custom.conf

Wireguard クライアントの構成

手順はサーバの時と同じで、設定ファイルのみが少し異なる。

[Interface]
## Private Key of VPN Client ##
PrivateKey = qCi5ugILVhTOOmCzchqFzkNaHM3HP1qFUWgtYun2A3w=

## IP address of VPN Client ##
Address = 192.168.108.102/24

[Peer]
## Public Key of Rocky 8 VPN Server ##
PublicKey = m58H6KTuRt+4z6g+jMIeRCdAkQoikkiVvTd7pJvrPGE=

## set ACL ##
AllowedIPs = 0.0.0.0/0

## IP address and Port of CentOS 8 VPN Server ##
Endpoint = 192.168.108.101:51820

なお起動後に、WireGuardサーバにVPN クライアント マシンの IP アドレスと公開キーを登録する必要がある。

[Peer]
## Public Key of VPN Client ##
PublicKey = 73gw+v4V0TKsw2uGLHJ9EI26qfMEwvk+JZ+xED2ttAs=

## IP Address of VPN Client ##
AllowedIPs = 192.168.108.102/32

wg-quickコマンド

wg-quickはWireGuardインターフェイスを起動するコマンド。

wg-quick up wg0

10 - 10.脅威と脆弱性の評価

【LPIC303範囲】Linuxとはあまり関係ないがOSやアプリケーションを取り巻く脅威に関して説明。

10.1. 一般的なセキュリティ脆弱性と脅威

10.1.1. マルウェア

ウィルス

コンピュータウイルスは、実行されると他のコンピュータプログラムを変更し、独自のコードを挿入することによって自分自身を複製するコンピュータプログラムの一種のこと。

コンピュータウイルスには通常、ホスト プログラムが必要です。ウイルスは独自のコードをホスト プログラムに書き込みます。プログラムを実行すると、先に書かれたウイルスプログラムが実行され、感染や被害を引き起こす。

マルウェア

マルウェアは悪意のあるソフトウェアのことで、コンピュータに損害を与えるように意図的に設計されたソフトウェアを指す。

マルウェアは、個人情報の漏洩、情報やシステムへの不正アクセスの原因となり、ユーザーの情報へのアクセスを奪ったり、ユーザーのコンピュータのセキュリティやプライバシーを知らず知らずのうちに妨害したりする。

10.1.2. その他のマルウェア

ワーム

コンピュータワームは、複数のデバイス上で活動を続けながら複数のデバイスに拡散するように設計された、潜行性のタイプのマルウェアのこと。

ワームの定義としては、ワームをユーザーの介入なしで実行および増殖できる自己完結型のマルウェアといえる。

ルートキット

ルートキットはコンピュータまたは他のソフトウェアへの不正アクセスを許可するように設計された悪意のあるソフトウェアバンドルのこと。 ルートキットは検出が難しく、感染したシステム内でその存在を隠すことができる。

ルートキットが定着すると、システムはゾンビ コンピュータであるかのように動作し、ハッカーはリモートアクセスを使用してデバイスを完全に制御できるようになる。

トロイの木馬

トロイの木馬は正当で安全であるように見えるファイル、プログラム、またはコードの一部に偽装された悪意のあるソフトウェアのこと。

通常、トロイの木馬はパッケージ化されて正規のソフトウェア内に配信され、多くの場合、被害者を監視したりデータを盗んだりするように設計されている。

キーロガ

キーロガはコンピュータ上で行われるすべてのキーストロークを記録する悪意のあるソフトウェアのこと。 キーロガーはスパイウェアの一種で、被害者を監視するように設計されたマルウェア。キーロガーは入力されたものをすべてキャプチャできるため、最も侵入的な形式のマルウェアの 1 つといえる。

キーロガーには主にソフトウェアとハ​​ードウェアの2つのタイプがある。

10.1.3. その他の脅威や攻撃

ソーシャルエンジニアリング

ソーシャルエンジニアリングは、心理学的手法を使用して行動を操作すること。ソーシャルエンジニアリングは、人的ミスを悪用し、被害者に自分の利益に反する行動を促すことによって行われる。

情報セキュリティにおけるソーシャル エンジニアリングの定義は、ログインの詳細や財務情報などの個人データをオンラインで漏洩させることを指す。

ソーシャルエンジニアリングの攻撃の1つにはフィッシングがある。

フィッシング

フィッシングはソーシャルエンジニアリング攻撃の一種で、通信が信頼できる送信元からのものであるかのように偽装されたメッセージから引き起こされる、個人情報や財務情報の漏洩を狙ったもの。

フィッシング攻撃は以下の3つの要素から構成される。

  1. 攻撃は電子メールや電話などの電子通信を介して行われる
  2. 攻撃者は、信頼できる個人または組織を装う
  3. 攻撃者の目的は、ログイン資格情報やクレジット カード番号などの機密の個人情報を取得すること

ブルートフォースアタック

ブルートフォース攻撃とは、ハッカーがコンピュータを利用した集中的な試行錯誤を通じてパスワードを解読しようとすること

ブルートフォースアタックではできるだけ多くのパスワードの組み合わせを試し、いずれかが機能することを狙う。

ブルートフォースアタックの種類には以下の種類がある。

  1. 単純攻撃
  2. 辞書攻撃
  3. ハイブリッド攻撃
  4. リバース攻撃
  5. クレデンシャルスタッフィング

レインボー攻撃

レインボー攻撃は特別なテーブル (「レインボー テーブル」) を使用してデータベース内のパスワード ハッシュを解読するパスワード クラッキング手法のこと。

レインボー テーブル自体は、認証プロセス中に使用される各プレーン テキスト文字のパスワード ハッシュ値を含む事前計算されたテーブルを指す。 ハッカーがパスワード ハッシュのリストにアクセスすると、レインボーテーブルを使用してすべてのパスワードを非常に迅速に解読する。

バッファオーバフロー攻撃

バッファオーバフローはデータ量がメモリ バッファの記憶容量を超えると発生し、原理としてはバッファにデータを書き込もうとするプログラムは、隣接するメモリ位置を上書きしてしまうことに起因する。

バッファオーバフロー攻撃ではアプリケーションのメモリを上書きすることプログラムの実行パスが変更され、ファイルが破損したり個人情報が漏洩したりする反応を狙う

攻撃者がプログラムのメモリ レイアウトを知っている場合、バッファに保存できない入力を意図的にフィードし、実行可能コードを保持する領域を上書きして、独自のコードに置き換えることができる。

なお、CやC++はメモリ内のデータの上書きやアクセスに対する保護機能が組み込まれていないため、バッファオーバフロー攻撃の影響を最も受けやすい言語といえる。

クロスサイトスクリプティング(XSS)

XSSはハッカーが正規の Web サイトに悪意のあるコードを挿入したときに発生する攻撃のこと。

XSS攻撃は、コードインジェクション攻撃の1種である。

クロスサイトリクエストフォージェリ(CSRF)

CSRFはエンド ユーザーが現在認証されている Web アプリケーション上で望ましくないアクションの実行を強制する攻撃のこと。

IPスプーフィング攻撃は

IPスプーフィングは偽の送信元アドレスを使用し、ハッカーはネットワーク上で信頼できるデバイスのように見せかけ、デバイスが自由に提供する機密情報を要求する可能性がある攻撃。

なお、IP アドレス スプーフィング攻撃は検出が難しい。 また中間者攻撃の種類にはDDos攻撃MITM攻撃がある。

DDoS攻撃

DDoS攻撃(分散型サービス拒否)はインターネット トラフィックを大量に送信して Web サイトやサーバーをクラッシュさせることを目的とした攻撃のこと。

DDoSでは複数のコンピュータを使用してサーバーに TCP および UDP パケットを大量に送信する。

MITM攻撃

MITM攻撃(中間者攻撃)は 2 つのデバイス間の通信を傍受し、IP パケットを静かに変更し 2 台のコンピュータ間の通信を傍受する攻撃のこと。

権限昇格

権限の昇格とは、ユーザーが資格のない権限を受け取ることを指す。 これらの権限は、ファイルの削除、個人情報の表示、ウイルスなどの不要なプログラムのインストールに使用される可能性がある。

権限昇格は以下の2種類の形式で行われる。

  • 垂直権限昇格 … 権限昇格とも呼ばれ、権限の低いユーザーまたはアプリケーションが、権限の高いユーザーまたはアプリケーション用に予約されている機能またはコンテンツにアクセスする
  • 水平的権限昇格 … 通常のユーザーが他の通常のユーザー向けに予約されている機能またはコンテンツにアクセスするもの

SQLインジェクション

SQLインジェクションは、ハッカーが独自のコードを Web サイトに挿入してセキュリティ対策を破り、保護されたデータにアクセスする秘密のタイプの攻撃

10.2. ペネトレーションテスト

10.2.1. 侵入テスト

侵入テスト(ペネトレーションテスト)はコンピュータ システムのセキュリティを評価するためにコンピュータ システムに対して実行される、許可された模擬攻撃のこと。

ペネトレーションテストでは、攻撃者と同じツール、テクニック、プロセスを使用して、システムの弱点がビジネスに与える影響を見つけて実証する。

侵入テストの種類

侵入テストには以下の3つの種類がある。

  • ブラックボックスペネトレーションテスト * テスターに​​会社名のみなど、最小限の情報が提供されるテスト
  • グレーボックスペネトレーションテスト * ターゲットとなる特定のホストやネットワークなど、もう少し詳しい情報がテスターに​​提供されるテスト
  • ホワイトボックスペネトレーションテスト * あらゆる種類の内部文書や構成計画などの情報が提供されているテスト

侵入テストのプロセス

侵入テストは通常以下のプロセスで実施される。

  1. 偵察
  2. スキャニング
  3. アクセス権の取得
  4. アクセス維持の確保
  5. 痕跡の消去

定番の侵入テストツール

侵入テストツールには以下のようなものがある。

  • Nmap … 開いているポートとサービスをスキャンできる
  • Metasploit … 脆弱性悪用ツール
  • WireShark … ネットワークからパケット データをキャプチャし、読み取り可能な形式にデコードできるネットワーク分析ツール
  • BurpSuite … Web アプリケーション セキュリティ テスト ツール