これは、このセクションの複数ページの印刷可能なビューです。 印刷するには、ここをクリックしてください.
3.Linuxサーバの高度な運用管理
1 - 1.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系がある。
機能 | Samba3 | Samba4 |
---|---|---|
ドメインコントローラ | NTドメインのドメインコントローラ構築ができる(NTMLv2の使用、WINSサーバによる名前解決、LDAP連携の可能) | ADドメインのドメインコントローラ構築ができる(Keroberos認証、DNSによる名前解決、LDAP内蔵) |
ファイルサーバ | SMB2に対応 | SMB2,SMB3に対応 |
Samba3.0系のデーモンプロセス
Samba3.0系のデーモンプロセスはsmbdとnmbにより提供される。
- 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
- Keroberos認証
- ActiveDirectoryドメインコントローラ機能
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]
パラメータ名 = 値
セクション | 説明 |
---|---|
global | Samba全体設定 |
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ファイル名
-v
はTDBファイルの検査と、問題がある場合はバックアップからリストアを行うオプション。
tdbdumpコマンド
TDBファイルの内容表示を行うコマンド。
tdbdump
tdbtoolコマンド
TDBファイルの対話的な管理を行うコマンド。
tdbtool
tdbrestoreコマンド
tdbバックアップからリストアするコマンド。
tdbrestore > <リストアファイル> < <バックアップファイル>
1.4.2. TDBファイル
Sambaが使用するデータベースファイルにはsercret.tdbとregistory.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
2.1. ActiveDirectoryドメインコントローラとしてのSamba
2.1.1. ActiveDirectory
ActiveDirectoryとは
ActiveDirectoryはWindowsのサーバの機能で、ネットワークにつないでいるクライアント端末やサーバー、プリンター、アプリケーションなどの情報を収集し、一元管理できるディレクトリサービスのこと。アカウントの管理を行うディレクトリ・サービス・システムともいえる。
ActiveDirectoryを使用するメリットは全てのネットワークリソースを、一つのオブジェクトとして、一元管理することが出来るようになることにある。
ドメイン環境とドメインコントローラ(DC)
ActiveDirectoryではユーザやコンピュータなどのリソースがドメインに参加することによりリソースの一元管理することが可能となう。 この一元管理にはドメインコントローラ(DC)と呼ばれる専用サーバが使用される。
ドメインコントローラによる認証手順は以下の通り
- ユーザがドメイン参加コンピュータにログインする
- 認証データをドメインコントローラに送信する
- ドメインコントローラで認証データが正しいと確認できた場合チケットを発行し返送する
- チケットを受け取ったクライアントはチケットを提示してアクセス先コンピュータで認証を試みる
- アクセス先コンピュータはチケットがドメインコントローラで発行されたか確認し、正しければクライアントアクセスを許可する
上記認証方式は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間でレプリケーションしない。
rsync
やrobocopy
を用いてレプリケーションを行うように設定できる。
2.1.6. GlobalCatalog
GlobalCatalogはActiveDirectory内の全てのドメインの一部の属性を保持する特別なデータベースのこと。 GlobalCatalogによりクロスドメインの検索やクエリが高速化される。
ポートは3268/TCP、3269/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のローカルユーザ管理
5 - 5.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 Server | LDAP |
MIT Keroberos | 認証サービス |
Dogtag Certificate System | PKI(公開鍵基盤) |
NTP | 時刻同期 |
DNS | IPアドレス/ドメインの紐づけ |
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では、セキュアな通信を確立するために以下の認証メカニズムが採用された。
認証メカニズム | 説明 |
---|---|
Keroberos | SSOを使用可能にする |
SPKM | シンプルな公開鍵基盤を提供する認証方式 |
LIPEKY | SPKMを使用したクライアント-サーバ間で暗号化通信を行う |
疑似(Pseudo)ファイルシステム
擬似(Pseudo)ファイルシステムは複数のファイルシステムをクライアント側で一つのツリーに見せかけることができる仕組み。 これはNFSv3の欠点を補った仕組みともいえる。
NFSv4サーバの設定
/etc/exports
- NFSv4の共有ディレクトリの設定は
/etc/exports
で行う
- NFSv4の共有ディレクトリの設定は
/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の暗号化
6.1. 暗号化の基礎
6.1.1. 暗号化とは
暗号化は暗号文を使用して通信と情報を保護する手法のこと。
コンピュータサイエンスにおいて、暗号化は、解読が困難な方法でメッセージを変換するための、数学的概念とアルゴリズムと呼ばれる一連のルールベースの計算から派生した安全な情報および通信技術を指す。 これらの決定論的アルゴリズムは、暗号キーの生成、デジタル署名、データ プライバシーを保護するための検証、インターネット上の Web ブラウジング、クレジット カード取引や電子メールなどの機密通信に使用される。
暗号化の用途
- 暗号化 … 情報をその本当の意味を隠す秘密コードに変換する方法。情報の暗号化と復号化の仕組みは暗号化と呼ばれる
- 完全性 …. 情報は、変更が検出されない限り、保存中または送信者と目的の受信者の間での転送中に変更されることはないことを保証する
- 認証 … 送信者と受信者は、互いの身元と情報の発信元/宛先を確認できる
暗号化の主要な要素
暗号化には2つの主要な要素がある。
- キー … データの暗号化に使用されるもの。秘密にしておく必要がある。
- アルゴリズム … メッセージのエンコードとデコードに使用されるメソッドのこと。
共通鍵暗号方式(対称暗号方式)
共通鍵暗号方式は暗号化と復号を同じ鍵で行うもの。
AESやDES、blowfishなどが代表例としてある。
このタイプの暗号化は、平文を暗号文に暗号化し、その暗号文を平文に復号化するために同じ鍵が使われるため対称と言える。 一般的に、非対称暗号化よりも高速となる。
公開鍵暗号方式(非対称暗号方式)
公開鍵暗号は暗号化/復号化に公開鍵ペアを使用する暗号。 対になる鍵の一方が公開鍵で、もう一方が秘密鍵となる。
鍵 | 説明 |
---|---|
公開鍵 | 一般にアクセス可能なリポジトリで公開され、公開鍵ペアの所有者と通信する必要がある人は誰でもアクセス可能 |
秘密鍵 | 秘密鍵は所有者のみが所有する |
これらの鍵はそれぞれ平文を暗号化された暗号文に変換することができるが、 一方の鍵で暗号化された暗号文はもう一方の鍵でしか復号できない。
特徴は以下の通り。
- 公開鍵で暗号化された暗号文は秘密鍵でしか復号化できない
- 秘密鍵で暗号化された暗号文は公開鍵を使ってのみ復号できる
- 共有秘密鍵を交換することなくメッセージを送信できる
また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 <サブコマンド> [オプション]
サブコマンド | 説明 |
---|---|
ca | CAの管理 |
dgst | メッセージダイジェストの計算 |
genrsa | RSA暗号方式の秘密鍵を生成 |
rsa | RSA暗号方式の鍵管理 |
req | CSRの管理 |
x509 | X.509証明書の管理 |
s_client | SSL/TLSプロトコルを使用し指定しサーバ接続 |
s_server | SSL/TLSプロトコルを使用しデータを受け取るサーバとして動作 |
ciphers | 使用可能な暗号スイートを一覧表示 |
verify | X.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証明書にはいくつかのエンコードタイプがあるが、代表的なものにPEMとDERがある。
- PEM
- DERをBase64でテキスト化したもの
- サーバー証明書、中間証明書、および秘密キーを1つのファイル内に含めることができる
- テキスト エディタで開くことができる
- OpenSSLデフォルトのファイル形式
- DER
- JavaベースのWebサーバーに使用される
- Binary形式
- PKCS#7
- 証明書のみを保存する
- 秘密キーは保存できない
- PKCS#12
- Windowsプラットフォームで使用される
- サーバー証明書、中間証明書、および秘密キーをパスワードで保護された単一の
.pfx
ファイル内に保存できる
また、それぞれの特徴を表にまとめると以下の通り。
フォーマット | エンコード | ファイルフォーマット |
---|---|---|
PEM | Base64 ASCII | .crt、.pem、.cer、.key |
DER | Binary | .der または .cer |
PKCS#7 | Base64 ASCII | |
PKCS#12 | Binary | .pfx、 .p12 |
X.509証明書のフィールド
フィールド1 | フィールド2 | 説明 |
---|---|---|
tbsCertificate | 証明書の基本情報と公開鍵の情報 | |
version | X.509証明書のバージョン X509v3では3(0x2) | |
serialNumber | 証明書の識別番号 | |
signature | CAが証明書に署名する際のアルゴリズム | |
issuer | CAの名前 | |
validity | 証明書の有効期間 | |
subject | 証明書の所有者の名前 | |
subjectPublicKeyInfo | 証明書所有者の公開鍵に関する情報 | |
extentions | 拡張領域。X.503v3にて追加 | |
signatureAlogorithm | 証明書の署名アルゴリズム | |
signatureValue | デジタル署名 |
X.509証明書の拡張フィールド
拡張フィールド | 説明 |
---|---|
basicConstraints | 基本制約。証明書がCAnのものである、証明書のパスの深さなどを指定 |
authorityKeyIdentifier | 認証局鍵識別子 |
subjectKeyIdentifier | サブジェクト識別子 |
KeyUsaga | 鍵の用途 |
extendedKeyUsage | 拡張鍵用途 |
certificatePolicies | 証明書の目的や発行時情報 |
subjectAltName | サブジェクトの代替名 |
cRLDistributionPoints | CRLの配布ポイント |
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が良い。
項目 | SSL | TLS |
---|---|---|
正式名称 | Secure Sockets Layer | Transport Layer Security |
プロトコル | Web トラフィックを保護するために使用されていたプロトコル | TLS プロトコルは、SSLv3 に代わる TLS 1.0 から始まる SSL の後継プロトコル |
状況 | 最新バージョンは SSLV3 だが、これは非推奨 | 現在の標準は TLS 1.2 。ただし、TLS 1.3 はインターネット標準として目的とされている |
TLS/SSLのハンドシェイクプロセス
TLS は、データを安全に送信する際のパフォーマンスとセキュリティの間で適切な妥協点を提供するため、公開鍵暗号方式と共通鍵暗号方式を組み合わせて使用する。 手順は以下の通り。
- 各TLS証明書は、公開キーと秘密キーで構成されるキーペアで構成される。これらのキーは、Web サイトのトランザクション中に相互作用する。
- Web サイトにアクセスするたびに、クライアント サーバーと Web ブラウザが通信して、安全な TLS/SSL 暗号化接続が確立されていることを確認する。
- Web ブラウザ (またはクライアント) がセキュリティで保護された Web サイトにアクセスすると、Web サイト サーバーは TLS/SSL 証明書とその公開キーをクライアントと共有して、安全な接続と一意のセッション キーを確立する。
- ブラウザは、SSL 証明書の発行者または認証局を認識し、信頼していることを確認します。また、ブラウザは、TLS/SSL 証明書の有効期限が切れていないこと、取り消されていないこと、および信頼できることを確認します。
- ブラウザは対称セッションキーを送り返し、サーバーは秘密キーを使用して対称セッションキーを復号化する。次に、サーバーはセッションキーで暗号化された確認応答を送り返し、暗号化されたセッションを開始する。
- サーバーとブラウザは、送信されるすべてのデータをセッションキーで暗号化するようになる。これらは、メッセージのプライバシー、メッセージの整合性、およびサーバーのセキュリティを保護する安全なセッションを開始することを意味する。
トランスポート層のセキュリティ
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/off | SSL/TLSプロトコルを使用するかどうかの設定 |
SSLProtocol SSLv3/TLSv1/TLSv1.2 | SSL/TLSのバージョン指定 |
SSLCipherSuite !AAA/-AAA/+AAA | 使用する暗号化スイートの指定 |
SSLCertificateFile | サーバ証明書の指定 |
SSLCertificateKeyFile | サーバの秘密鍵を指定 |
SSLCertificateChainFile | 中間認証局(CA)の証明書を指定 |
クライアント認証関連のディレクティブ | 説明 |
---|---|
SSLCACertificateFile | クライアント証明書を発行したCAの証明書を指定 |
SSLVerifyClient | クライアントの認証レベルの指定 |
SSLVerifyDepth | 有効なクライアント証明書を確認する深さを指定 |
OCSP stapling関連のディレクティブ | 説明 |
---|---|
SSLUseStapling on/off | OCSP staplingの有効/無効 |
SSLStaplingResponderTimeiut | OCSP staplingの応答タイムアウト |
SSLStaplingReturnResponseErrors on/off | OCSP staplingのエラーをクライアントに送信するかどうか |
SSLStaplingCache | OCSP 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-encryptとLUKS (通常は連携して使用する)
- 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
を用いて暗号化デバイス(パーティション)を利用する流れは以下の通り
- (LUKSモード利用時)luksFormatによるパーティションの初期化
cryptsetup luksFormal /dev/sdb2
- openまたはluksOpenによる暗号化マッピングの作成
cryptsetup open --type plain /devsdb1 dm01
cryptsetup luksOpen /dev/sdb2 dm02
- mkfsおよびパーティションのマウント
mkfs.ext4 /dev/mapper/dm02
mount /dev/mapper/dm02 /mnt/luks
なお利用終了時は、アンマウントし暗号化マッピングを削除する。
- パーティションのアンマウント
unmount /mnt/luks
- 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.com
やbbb.example.com
作成し、親ドメインのゾーンから見つけられるようにする(委任)するもの
スプリットビューDNS(スプリットホライズンDNS)
スプリットホライズンDNSを使用すると、要求に応じて同じ名前に対して異なる回答 (異なるリソースレコードセット) を提供できる。
この機能は、クエリが開発ネットワークから送信された場合はアプリの開発/ステージング バージョンを提供し、クエリがパブリックインターネットから送信された場合はアプリの運用/公開バージョンを提供するといったことに利用できる。
リソースレコード
リソースレコードはドメイン名と IP アドレスに関するデータを保存するために使用されるもの。 DNSゾーンのデータベースは、リソース レコードのコレクションで構成される。 各リソース レコードは、特定のオブジェクトに関する情報を指定する。
リソースレコードタイプ | 説明 |
---|---|
SOA | 管理情報の記述 |
NS | ゾーンを管理するDNSサーバを記述 |
MX | メールサーバを記述(正引きのみ) |
A | ホスト名に対するIPアドレスを記述(正引きのみ) |
AAAA | ホスト名に対するIPv6アドレスを記述(正引きのみ) |
CNAME | ホスト名の別名に対するホスト名を記述(正引きのみ) |
PTR | IPアドレスに対するホスト名を記述(逆引きのみ) |
TLSA | デジタル署名されたレコード。サーバ認証に使われる証明書や鍵の情報がドメイン名に対して関連付けられてDANE(DNSを使った認証の仕組み)で用いられる |
レコードセット
レコードセットは同じ名前と同じタイプで、データ値が異なるレコードのこと。 以下は同じ名前とタイプを持つ複数のレコードを含むレコードセットの例。
DNS名 | タイプ | TTL (秒) | データ |
---|---|---|---|
db-01.dev.gcp.example.com | A | 50 | 10.128.1.35 |
db-01.dev.gcp.example.com | A | 50 | 10.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 サーバーを使用する |
dig | digコマンドのバージョンとルートDNS サーバーを表示します |
delvコマンド
delvコマンドはBIND 9.10以降のdigコマンドの後継ツール。
delv <オプション> ドメイン名
オプション | 説明 |
---|---|
+rtrace | クエリされたすべてのレコードリソースをリストするだけ。DNSSEC の詳細は含まれない |
+mtrace | rtrace と同じだが、すべてのレコードリソースの完全な内容が含まれる |
+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.conf
のoptions
セクションへ以下の二つの項目を設定する必要がある。
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.conf
のoptions
セクションに以下のように記載する。
options {
version "表示したい文字列";
:(以下省略)
DNSのリソースレコード
DNSはIPアドレスとドメイン名とを紐づけるためのデータベースをリソースレコードと呼ばれる形で保持する。 DNSSECで使用されるリソースレコードは以下の通り。
リソースレコード | 説明 |
---|---|
DS | KSK公開鍵のハッシュ値を含む情報 親ゾーンに登録すると信頼の連鎖を構築する |
DNSKEY | 公開鍵の情報 キャッシュDNSサーバが署名を検証するために公開鍵を使用する |
RRSIG | 各リソースレコードへのデジタル署名 キャッシュDNSサーバが権威DNSサーバからの応答に対する正当性を検証するために使用 |
NSEC | 存在しないサーバへ問い合わせがあった際に不在証明のため辞書順で並べた際に次の位置するゾーン情報を示す |
NSEC3 | NSECを改良したもの。直接のゾーン名ではなくハッシュ化されたゾーン名を示す |
NSEC3PARAM | 権威DNSサーバがNSEC3を生成する際に必要な情報 |
TLSA | DANEにおいて用いられるレコード(ドメイン名にX.509証明書情報の紐づけ) |
TLSAレコードを除き、基本的には署名を行うと署名や公開鍵を含んだレコード(ゾーンファイル)が作成される。 DNSKEYリソースレコードには上述の通りKSK・ZSKの公開鍵が含まれ、これらは各リソースレコードの検証に使用される。
BINDのDNSSEC関連ユーティリティ
DNSサーバソフトウェアであるBINDには、サーバやKSK、ZSKの生成・管理などを行うための以下のようなコマンドユーティリティがある。
コマンド | 機能 |
---|---|
dnssec-keygen | DNSSECのZSK/KSKを生成する |
dnssec-signzone | ゾーンファイルへの署名を行う(NSEC, NSEC3, RRSIG, DNSKEYなどの生成) |
dnssec-settime | 鍵ファイルのメタデータである時間の表示/変更 |
dnssec-dsfromkey | 鍵ファイルから上位サーバに登録するDSレコード生成する |
openssl | TLSAレコードの検証を行う |
rndc | BIND 9.0以降の制御設定ツール |
delv | BIND 9.10以降の検証/解析ツール |
6.5.7. DNSSECの設定
dnssec-keygenコマンド
dnssec-keygenはDNSSECのキーを生成することができるコマンド。
dnssec-keygen -a RSASHA256 -b 512 -n ZONE -f KSK myzone.
オプション | 説明 |
---|---|
-a | アルゴリズムの指定 |
-b | キーサイズ |
-n | nametype |
-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.ホストのセキュリティ
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 時間 (秒単位) |
-u | 1 人のユーザーが使用できるプロセスの最大数 |
-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
cd spectre-meltdown-checker
chmod u+x spectre-meltdown-checker.sh
./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 | ファイル種別 |
i | inode番号 |
l | リンク名 |
n | リンク数 |
u | ユーザ |
g | グループ |
s | ファイルサイズ |
b | ブロック数 |
m | 最終更新時刻 |
a | 最終アクセス時刻 |
c | 最終ステータス更新時刻 |
S | サイズの増分 |
I inode番号の変更は無視 | |
acl | アクセスコントロールリスト |
selinux | SELinuxのコンテキスト |
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.rules
やauditctl
コマンドで設定する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 | 現在の設定のリスト表示 |
-s | Auditシステムのステータス表示 |
ファイルシステムルールに関するオプション | 説明 |
---|---|
-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など)はツリー上に細分化され、各枝や葉には独自の重み/制限がある。 コントローラのグループは複数のプロセスが関連付けられているため、リソースしよるいつが細かくなっており微調整が容易となっている。
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.アクセス制御
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 file1 | setfacl –set-file=- file2 |
getfacl –access dir | setfacl -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_t | SSH接続時に使用 |
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 | 動作モードの一時的変更 |
selinuxenabled | SELinuxが有効か数値で返す |
chcon | ファイルやディレクトリのセキュリティコンテキストを変更 |
restorecon | セキュリティコンテキストの復元 |
runcon | 指定されたセキュリティコンテキストでコマンドを実行 |
fixfiles | SELinuxの設定ファイルに従いすべてのファイルにラベルを付与 |
setfiles | 指定した設定ファイルに従ってファイルにラベルを付与 |
sestatus | SELinuxの現状を表示 |
seinfo | SELinuxのロールやドメインなど各種情報を表示 |
newrole | 指定したロールに変更してシェルを起動 |
getsebool | Bool値で示されるポリシーの状態取得 |
setsebool | Bool値で示されるポリシーの設定 |
togglesebool | Bool値で示されるポリシーの値変更 |
semanage | SELinuxに関する各種操作 |
解析系コマンド | 説明 |
---|---|
apol | GUIでSELinuxポリシの分析 |
seaudit | GUIで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
runconコマンド
指定された SELinux コンテキストでコマンドを実行するコマンド。
runcon
8.2.3. 汎用的なSELinux管理コマンド
semanageコマンド
ポリシーソースの変更や再コンパイルを必要とせずに、SELinux ポリシーの特定の要素を構成するために使用されるコマンド。
semanage <引数>
引数 | 説明 |
---|---|
import | ローカルのカスタマイズをインポート |
export | ローカルのカスタマイズを出力 |
login | Linux ユーザーと SELinux 制限付きユーザーの間のログイン マッピングを管理する |
user | SELinux 制限付きユーザーの管理 (SELinux ユーザーの役割とレベル) |
port | ネットワークポートタイプ定義の管理 |
interface | ネットワークインターフェースタイプの定義を管理する |
module | SELinux ポリシーモジュールの管理 |
nodenetwork | ノード タイプの定義を管理する |
fcontext | ファイルコンテキストマッピング定義の管理 |
boolean | ブール値を管理して機能を選択的に有効にする |
permissive | プロセスタイプ強制モードの管理 |
dontaudit | ポリシー内の dontaudit ルールを無効/有効にする |
ibpkey | infiniband pkey タイプ定義の管理 |
ibendport | Infiniband エンドポートタイプ定義の管理 |
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番号ではなくファイルパスにタイプを割り当てる
- モード:
Enforcement
とComplain
の2つ aa-genprof
とaa-logpro f
コマンド(ポリシ作成に使用)がある
- Smack
- カーネルにコンパイルする必要がある
- ラベルの割り当てに拡張ファイル属性を使用
-Z
SELinux のようなフラグを使用chsmack
コマンドをラベル情報のクエリと設定に使用する
9 - 9.ネットワークセキュリティ
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 を読み取る |
基本構成
デフォルトの構成を使用することがサーバの設定を最も破壊せずに使用できる方法といえる。 この場合、ユーザとパスワードの設定のみでよくなる。 手順は以下の通り。
/etc/raddb/clients.conf
を編集してエントリ追加するipaddr
にクライアントIP、secret
には通信の暗号化と復号化に使用される共有秘密を指定/etc/raddb/users
を編集しユーザアカウントを作成するtesting Cleartext-Password := "password"
のように設定- サーバーをデバッグモードで起動する(
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 | プロミスキャスモードにしない |
-m | MIBモジュールを読み込む |
条件式修飾子 | 説明 |
---|---|
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=BA gt B
… A>BA ge B
… A>=BA lt B
… A<BA le B
… A<=BA and B
… AかつBA or B
… AまたはBnot <条件式>
… 条件満たさないとき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_client
とkismet_drone
、kismet_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で帯域監視を行えるソフトウェアにntopやCacti)がある。
Ntop(ntopng)
ntopはネットワークトラフィック(L2,L3)監視ソフトウェアで、ネットワークのステータス、UDP、TCP、DNS、HTTP、その他のプロトコルのトラフィックのプロトコルごとの分布をWebブラウザ上で確認できる。
設定ファイルは/etc/ntopng.conf
となる。
ntop コマンド | 説明 |
---|---|
/usr/sbin/ntop -A | ntop 管理者ユーザーのパスワードを設定する |
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.rules | DoS攻撃を検出するためのルール |
ftp.rules | FTPサービスへの攻撃を通知するためのルール |
local.rules | ユーザ独自のルール |
scan.rules | スキャンを検知するためのルール |
smtp.rules | smtpサービスへの攻撃を検知するためのルール |
telnet.rules | telnetサービスへの攻撃を検知するためのルール |
web-cgi.rules | WEBサーバの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を操作するユーティリティには以下のようなものがある。
ユーティリティ | 機能 |
---|---|
openvasmd | OpenVasManager: 各種操作が行える |
openvasmd –rebuild | データベースの再構築を行う |
openvassd | スキャン処理を行う |
openvas-nvt-sync | NVTsを更新する |
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秒あたりの接続数制限
state
とrecent
モジュールを使用すると、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セットを作成 |
add | IPセットにエントリを追加 |
del | IPセットからエントリを削除 |
destroy | IPセットを破棄 |
list | IPセットの内容をリスト |
flush | IPセット内のすべてのエントリを削除 |
test | 指定したIPがIPセットに含まれているかどうかを確認 |
swap | 2つのIPセットの内容を交換 |
rename | IPセットの名前を変更 |
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ではユーザが自分で作成する。
ルール作成の手順は以下の通り
- テーブル作成 …
nft add table
- チェインの作成 …
nft add chain
- ルールの作成 …
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を作成したら以下ステップを実行する
./easyrsa init-pki
でpkiディレクトリの開始sudo ./easyrsa build-ca
でCA証明書の作成sudo ./easyrsa gen-req myov-server nopass
でキーペアと証明書のリクエストを作成sudo ./easyrsa sign-req server myov-server
でサーバキーに署名するsudo ./easyrsa gen-dh
でキー交換のためのDH鍵を作成する- 上記で作成したファイルを
/etc/openvpn/server/
にコピーする(ca.crt,dh.pem, .key, .crt) sudo ./easyrsa gen-req client nopass
でクライアント キーを取得するsudo ./easyrsa sign-req client client
で生成された CA 証明書を使用してクライアント キーに署名する- 上記で生成したファイルを
/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のアーキテクチャではセキュリティアソシエーションを識別するパラメータは3つある。
- SPI(Security Parameter Index)、受信側システムが受信パケットを選択するためのIPSecプロトコルヘッダを伝えるビット文字列
- IP宛先アドレス、IPSecのエンドポイントアドレス
- セキュリティプロトコル識別子
SAD(Security Association Database)
SPD(Security Policy Database)
IPSecプロトコル
IPSecではAH(プロトコル認証ヘッダ)、ESP(カプセル化セキュリティペイロード)の2つのプロトコルを使用してトラフィックセキュリティサービスを提供する。
- プロトコル認証ヘッダ (AH) * IP ヘッダーとデータ ペイロードがハッシュされるために使用 * ハッシュから新しい AH ヘッダーが構築され、パケットに追加される * 認証機能と未改竄の保証
- セキュリティペイロードのカプセル化 (ESP) * データ パケットの暗号化と整合性を提供するセキュリティ プロトコル * 標準 IP ヘッダーの後に追加される * AHの機能+暗号化
IPSec暗号化の技術
IPSecのセキュリティアソシエーションではトンネルモードとトランスポートモードの2つのモードの操作を設定できる。
- トンネルモード * ペイロードとヘッダーの両方が暗号化される * ゲートウェイ間、またはエンド ステーションからゲートウェイへの使用が一般的 * パケットの送信元がセキュリティを提供するデバイスと異なる場合は、トンネル モードが使用
- トランスポートモード * 各パケットのデータ部分のみが暗号化される * エンド ステーション間、またはエンド ステーションとゲートウェイの間に適用できる
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 およびその他のプラットフォームに移植された。特徴は以下の通り。
- 構成がシンプル
- 強力な暗号化と認証方法の提供
- 大規模で複雑なVPNネットワークをサポートする
- 拡張性に優れたモジュラー設計
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.d
に99-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.脅威と脆弱性の評価
10.1. 一般的なセキュリティ脆弱性と脅威
10.1.1. マルウェア
ウィルス
コンピュータウイルスは、実行されると他のコンピュータプログラムを変更し、独自のコードを挿入することによって自分自身を複製するコンピュータプログラムの一種のこと。
コンピュータウイルスには通常、ホスト プログラムが必要です。ウイルスは独自のコードをホスト プログラムに書き込みます。プログラムを実行すると、先に書かれたウイルスプログラムが実行され、感染や被害を引き起こす。
マルウェア
マルウェアは悪意のあるソフトウェアのことで、コンピュータに損害を与えるように意図的に設計されたソフトウェアを指す。
マルウェアは、個人情報の漏洩、情報やシステムへの不正アクセスの原因となり、ユーザーの情報へのアクセスを奪ったり、ユーザーのコンピュータのセキュリティやプライバシーを知らず知らずのうちに妨害したりする。
10.1.2. その他のマルウェア
ワーム
コンピュータワームは、複数のデバイス上で活動を続けながら複数のデバイスに拡散するように設計された、潜行性のタイプのマルウェアのこと。
ワームの定義としては、ワームをユーザーの介入なしで実行および増殖できる自己完結型のマルウェアといえる。
ルートキット
ルートキットはコンピュータまたは他のソフトウェアへの不正アクセスを許可するように設計された悪意のあるソフトウェアバンドルのこと。 ルートキットは検出が難しく、感染したシステム内でその存在を隠すことができる。
ルートキットが定着すると、システムはゾンビ コンピュータであるかのように動作し、ハッカーはリモートアクセスを使用してデバイスを完全に制御できるようになる。
トロイの木馬
トロイの木馬は正当で安全であるように見えるファイル、プログラム、またはコードの一部に偽装された悪意のあるソフトウェアのこと。
通常、トロイの木馬はパッケージ化されて正規のソフトウェア内に配信され、多くの場合、被害者を監視したりデータを盗んだりするように設計されている。
キーロガ
キーロガはコンピュータ上で行われるすべてのキーストロークを記録する悪意のあるソフトウェアのこと。 キーロガーはスパイウェアの一種で、被害者を監視するように設計されたマルウェア。キーロガーは入力されたものをすべてキャプチャできるため、最も侵入的な形式のマルウェアの 1 つといえる。
キーロガーには主にソフトウェアとハードウェアの2つのタイプがある。
10.1.3. その他の脅威や攻撃
ソーシャルエンジニアリング
ソーシャルエンジニアリングは、心理学的手法を使用して行動を操作すること。ソーシャルエンジニアリングは、人的ミスを悪用し、被害者に自分の利益に反する行動を促すことによって行われる。
情報セキュリティにおけるソーシャル エンジニアリングの定義は、ログインの詳細や財務情報などの個人データをオンラインで漏洩させることを指す。
ソーシャルエンジニアリングの攻撃の1つにはフィッシングがある。
フィッシング
フィッシングはソーシャルエンジニアリング攻撃の一種で、通信が信頼できる送信元からのものであるかのように偽装されたメッセージから引き起こされる、個人情報や財務情報の漏洩を狙ったもの。
フィッシング攻撃は以下の3つの要素から構成される。
- 攻撃は電子メールや電話などの電子通信を介して行われる
- 攻撃者は、信頼できる個人または組織を装う
- 攻撃者の目的は、ログイン資格情報やクレジット カード番号などの機密の個人情報を取得すること
ブルートフォースアタック
ブルートフォース攻撃とは、ハッカーがコンピュータを利用した集中的な試行錯誤を通じてパスワードを解読しようとすること。
ブルートフォースアタックではできるだけ多くのパスワードの組み合わせを試し、いずれかが機能することを狙う。
ブルートフォースアタックの種類には以下の種類がある。
- 単純攻撃
- 辞書攻撃
- ハイブリッド攻撃
- リバース攻撃
- クレデンシャルスタッフィング
レインボー攻撃
レインボー攻撃は特別なテーブル (「レインボー テーブル」) を使用してデータベース内のパスワード ハッシュを解読するパスワード クラッキング手法のこと。
レインボー テーブル自体は、認証プロセス中に使用される各プレーン テキスト文字のパスワード ハッシュ値を含む事前計算されたテーブルを指す。 ハッカーがパスワード ハッシュのリストにアクセスすると、レインボーテーブルを使用してすべてのパスワードを非常に迅速に解読する。
バッファオーバフロー攻撃
バッファオーバフローはデータ量がメモリ バッファの記憶容量を超えると発生し、原理としてはバッファにデータを書き込もうとするプログラムは、隣接するメモリ位置を上書きしてしまうことに起因する。
バッファオーバフロー攻撃ではアプリケーションのメモリを上書きすることプログラムの実行パスが変更され、ファイルが破損したり個人情報が漏洩したりする反応を狙う。
攻撃者がプログラムのメモリ レイアウトを知っている場合、バッファに保存できない入力を意図的にフィードし、実行可能コードを保持する領域を上書きして、独自のコードに置き換えることができる。
なお、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つの種類がある。
- ブラックボックスペネトレーションテスト * テスターに会社名のみなど、最小限の情報が提供されるテスト
- グレーボックスペネトレーションテスト * ターゲットとなる特定のホストやネットワークなど、もう少し詳しい情報がテスターに提供されるテスト
- ホワイトボックスペネトレーションテスト * あらゆる種類の内部文書や構成計画などの情報が提供されているテスト
侵入テストのプロセス
侵入テストは通常以下のプロセスで実施される。
- 偵察
- スキャニング
- アクセス権の取得
- アクセス維持の確保
- 痕跡の消去
定番の侵入テストツール
侵入テストツールには以下のようなものがある。
- Nmap … 開いているポートとサービスをスキャンできる
- Metasploit … 脆弱性悪用ツール
- WireShark … ネットワークからパケット データをキャプチャし、読み取り可能な形式にデコードできるネットワーク分析ツール
- BurpSuite … Web アプリケーション セキュリティ テスト ツール