タグ: network

Apach と nginx への HSTS 設定

HSTS(HTTP Strict Transport Security)とは?

  • SSL に対応しているウェブサーバーへの HTTP リクエストに対し、サーバー側がレスポンスヘッダに SSL 通信が可能であることを表すデータを付与することにより、ブラウザに HTTPS での通信を行うことを促す仕組みを HSTS とよぶ
  • RFC6797 で定義される: https://tools.ietf.org/html/rfc6797
  • 301 でリダイレクト先を指定する際、そのリダイレクト先が改ざんされていないことを保証できない欠点を補える

技術的な仕組み

  1. ユーザーが HTTP リクエストを対象サーバーに送る
  2. サーバーは https エンドポイントへ301リダイレクトレスポンスを返す
  3. https エンドポイントはレスポンスヘッダに 以下を付与しブラウザに HTTPS で通信を行うことを促す
    • Strict-Transport-Security "max-age=31536000; includeSubDomains"
    • ここで max-age はブラウザ側に当該ドメインが HTTPS 通信に対応しているという事実をキャッシュする長さ(秒)である
    • includeSubDomains をつけるとサブドメインを含めて、HTTPS 通信に対応しているということを伝達する
  4. HSTS に対応しているブラウザは、その後対象ドメインに対してはデフォルトで HTTPS を見に行く

注意点

  • 誤った設定であろうと、一度 Strict-Transport-Security ヘッダーを受け取ったHSTS対応のブラウザは max-age の時間分、対象ドメインにHTTPでリクエストを送ろうとしても HTTPS に切り替えてしまう
  • 誤設定の可能性を考慮すると、最初の設定の max-age は短くしておき、作業ミスがあった際の影響を小さく留めておくとよい

Apache, nginx への設定

  • 基本的にはレスポンスヘッダに Strict-Transport-Secutiry を追加するだけ
    • Apach は mod_header モジュールを用いて、レスポンスヘッダを追加
    • nginx は add_header ディレクティブで、レスポンスヘッダを追加

Apache

nginx

動作確認

preload の登録

https://hstspreload.org/ で登録する

chrome での処理のされ方

307 でリダイレクトがかかる模様

ssllabs での確認

https://www.ssllabs.com/ssltest/analyze.html?d=53ningen.com で見れば HSTS が有効になっていることがわかる

さくらVPSのスイッチを利用してローカルネットワークを構成する

さくら VPS のスイッチを用いて L2 接続をして、次のような構成を作る手順メモ

1. さくらVPS管理画面上でスイッチを作成する

2. サーバーを停止する

作業対象サーバー内から shutdown コマンドでサーバーを停止する

3. 接続先スイッチ追加

接続先スイッチとして eth1 に先ほど作ったスイッチを指定する

3. サーバーを起動する

さくらVPS 管理画面からサーバーを起動する

4. IP アドレスの設定

次のように IP アドレスを割り当てた

  • front01.eth1: 192.168.128.11/24
  • back01.eth1: 192.168.128.111/24

5. front01 のネットワーク設定

back01 からインターネットに出るときは front01 を経由して外にでるために、front に NAPT 設定を入れる。
firewalld を使う場合以下のような形で設定する。

6. back01 のネットワーク設定

back01 はインターネットに晒したくないサーバーにあたるため、eth0 の自動起動をオフにしてインターフェースを落とす。今回は nmtui 経由でやった。また、このままだと back01 はインターネットに出られないため、gateway として front01 の back側 IP を指定した。諸々設定後、以下で動作確認して無事 global 側の IP アドレスでインターネットに出られていれば、うまく設定できたということになる。

RHEL7 系の Firewall 設定

firewalld とは

  • RHEL6 系までは iptables が利用されていた
  • RHEL7 系では firewalld がデフォルトとなった
  • firewalld は、デフォルトで iptablesip6tablesebtables のリストアコマンドを使用し、ルールセットを変更する全ファイアウォールアクションを高速化する
  • CLIツールとして firewall-cmd、GUI ツールとして firewall-config が用意されている
  • firewalld が提供するファイアウォールのサービスは、設定の変更はいつでも可能で即座に実行される
    • 変更は保存したり適用したりする必要がない
  • firewalld の設定は /usr/lib/firewalld//etc/firewalld/ に保存される

情報ソース

firewalld と system-config-firewall および iptables との比較

firewalldiptables(ip6tables) の本質的な違いは以下の2つ

  • 設定ファイルの場所が違う
    • iptables は設定を /etc/sysconfig/iptables/etc/sysconfig/ip6tables に保存する
    • firewalld は設定を /usr/lib/firewalld//etc/firewalld/ に保存する
    • RHEL7 の初期状態では firewalld がデフォルトでインストールされるので /etc/sysconfig/iptables ファイルが存在しない
  • 設定追加に iptables は全て再読み込みを行うが、firewalld は差分更新のみを行う
    • firewalld では既存の接続が瞬断されることなく設定追加が可能

情報ソース

firewall-cmd コマンドラインツールを使用したファイアウォールの設定

ゾーンの設定

  • firewalld には典型的な設定のテンプレートであるゾーンが用意されている
  • ゾーンの種類は以下のとおり
    • drop
    • block
    • public
    • external
    • dmz
    • work
    • home
    • internal
    • trusted

ゾーンの設定と確認方法は以下のとおり

ポート開放

  • dmz ゾーンに対して、ポート 8080 への TCP トラフィックを許可する場合は以下のようなかたち
  • かならず --parmanent で永続化する

サービスを追加する場合は以下のようにできる

情報ソース

RHEL7 系のネットワーク設定

6 系と変わった点、変わってない点を整理するために調査した。主に参照した情報ソースは「RHEL7ドキュメント」「標準テキスト CentOS7」の2つ。

NetworkManger とは

ドキュメント

概要

  • RHEL6 ではネットワークスクリプト(/etc/init.d/network)によりネットワーク設定が行われていた
    • ここが /etc/sysconfig/network-scripts/etc/sysconfig/static-routes などを読んでいた
  • RHEL7 より NetworkManager を使ってネットワーク設定することが推奨されている
  • ただしそのままスクリプトを継続して使用することもできる
  • NetworkManager は現在、RHEL 7 でデフォルトで使用されている
  • NetworkManager を無効すると、ネットワークインターフェイス管理には代わりに initscripts が使用される
  • NetworkManager の使用が増えてきているため、今後のメジャーリリースで Network Initscript が廃止になる可能性がある
  • RHEL7 では NetworkManager が最初に起動し、/etc/init.d/network が NetworkManager をチェックして NetworkManager 接続の改ざんを防ぐ
  • NetworkManager は sysconfig 設定ファイルを使用するプライマリーアプリケーションとされており、/etc/init.d/network はフォールバックとなるセカンダリーとされている
  • RHEL7 でのネットワーク設定の方法には具体的には以下の4つの方法がある
    • nmcli
    • nmtui
    • GNOME コントロールセンター
    • ファイルを直接編集する

NetworkManager の制御

ドキュメント

概要

  • NetworkMangersystemd によって管理されていて、デフォルトでは起動時に立ち上がる
  • 制御は systemctl コマンドを利用して以下のように行う

  • NetworkManager がデーモンで起動していることは次のように確認できる

ネットワーク設定と設定ファイル

ネットワーク設定ファイルの位置はかわらずだが、ファイルを直接編集せず nmcli, nmtui などを利用することが推奨されている。サーバー構築時に主に設定する内容と対応する設定ファイルは以下のとおり。

  • ホスト名とIPアドレスの対応関係: /etc/hosts
  • 問い合わせ先DNSサーバ設定: /etc/resolve.conf
    • nmcli で DNS サーバーを指定すると自動的に更新される
  • ネットワーク名とネットワークアドレスの対応関係: /etc/networks
  • インターフェースの設定: /etc/syscnofig/network-scripts/ifcfg-*
    • NIC の命名が eth0, eth1 のような形ではなく、udev によりデバイスに応じて命名されている
  • インターフェースごとのルーティング設定: /etc/sysconfig/network-scripts/route-*
    • ip コマンドを使って設定した静的ルートは、システムが終了したり再起動すると失われる

重要な設定を一部抜粋して確認する

/etc/sysconfig/network-scripts/ifcfg-*

ドキュメント

概要

  • ip コマンドを使ったネットワークインターフェースの設定は、システムが終了したり再起動すると失われる
  • システム再起動後も維持されるようにネットワークインターフェースを設定するには、/etc/sysconfig/network-scripts/ ディレクトリー内のインターフェースごとの設定ファイルに格納する必要がある
  • ファイル名は、ifcfg-
  • 設定項目はざっくりと以下のような具合
    • TYPE(Ehternet, Wireless, Bridge): 種類
    • BOOTPROTO(none, bootp, dhcp): 起動方法
    • DEFROUTE(yes, no): デフォルトルートとして使用されるか
    • IPV4_FAILURE_FATAL(yes, no): IPV4 で初期化に失敗したときにインターフェースを起動失敗扱いにするか
    • NAME: インターフェースの名前
    • UUID: そのまま
    • DEVICE: 物理デバイス名
    • ONBOOT(yes, no): 起動時にインターフェースを起動するか
    • IPADDR: IPアドレス
    • PREFIX: ネットマスク

  • ネットワークインターフェースの設定には以下の方法がある
    • nmcli コマンドを実行する
    • nmcli エディターを利用する
    • nmtui を利用する

コネクション名が扱いづらい形なので修正したほうが作業がしやすい

設定はおおむね以下のような形

/etc/sysconfig/network-scripts/route-*

ドキュメント

概要

  • ip コマンドを使って設定した静的ルートは、システムが終了したり再起動すると失われる
  • システム再起動後も維持される静的ルートを設定するには、/etc/sysconfig/network-scripts/ ディレクトリー内のインターフェースごとの設定ファイルに格納する必要がある
  • ファイル名は、route-
  • このファイルへの記述は次の2つの形式が利用できる
    • IP コマンド引数形式を使用した静的ルート
    • ネットワーク/ネットマスクディレクティブの形式

  • 静的ルートを設定するには、以下の方法がある
    • nmcli コマンドを実行する
    • nmcli エディターを利用する

非推奨: /etc/sysconfig/network

個別のデバイス設定を用いることを推奨、グローバルのnetworkファイルは非推奨になった。

Red Hat Enterprise Linux ではグローバルの /etc/sysconfig/network ファイルの使用は非推奨となっており、ゲートウェイの指定はインターフェースごとの設定ファイルでのみ行なってください。
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/networking_guide/sec-using_the_command_line_interface

nmcli コマンドについて

公式ドキュメント: https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/networking_guide/sec-using_the_networkmanager_command_line_tool_nmcli

  • nmcli は各種ネットワーク設定をコマンドラインから実行できるツール
  • 各パラメータは全方一致で省略が可能

networking

ネットワークへの接続性を確認/制御できる

  • on, off, connectivity の三種類

connectivityの状態は、none(切断), portal(認証前), limited(インターネットに出れない), full(インターネットに出れる), unknown(不明) の5種類

general

  • NetworkManager の状態や権限などを表示できる
  • ホスト名, ログレベル, ドメインを取得できる

ip コマンドについて

  • RHEL7 系では route, ifconfig コマンド(net-tools)に代わり、ip コマンド(iproute2)の利用が推奨されている
  • ip コマンドはルーティング、デバイスなどを表示・設定できるコマンド