Solaris のシステム管理 (第 3 巻)

第 19 章 IPsec の実装

この章では、ネットワークに IPsec を実装する手順について説明します。

IPsec の概要については、第 18 章「IPsec の概要」を参照してください。ipsecconf(1M)ipseckey(1M)ifconfig(1M) の各マニュアルページにも個別に例に応じた説明があります。

IPsec 実装の作業マップ

表 19-1 IPsec 実装の作業マップ

作業 

説明 

操作方法の掲載個所 

システム間のトラフィックの保護 

/etc/hosts ファイルに対するアドレスの追加、/etc/inet/ipsecinit.conf ファイルの編集、セキュリティアソシエーションの追加、ipsecinit.conf ファイルの呼び出し

「2 つのシステム間のトラフィックの保護」

IPsec ポリシーによる Web サーバーの保護 

ipsecinit.conf ファイルの編集と呼び出しによる保護トラフィックだけを使用可能

「IPsec ポリシーによる Web サーバーの保護」

仮想プライベートネットワークのセットアップ 

IP 送信のオフ、IP の厳密宛先マルチホーム、大半のネットワークサービスとインターネットサービスの無効化、セキュリティアソシエーションの追加、保護トンネルの設定、IP 送信のオン、デフォルトルートの設定、ルーティングプロトコルの実行 

「仮想プライベートネットワークの構築」

現在のセキュリティアソシエーションの変更 

現在のセキュリティアソシエーションのフラッシュと新しいセキュリティアソシエーションの入力 

「現在のセキュリティアソシエーションの変更」

IPsec 作業

この節では、2 つのシステム間のトラフィックを保護し、IPsec ポリシーで Web サーバーを保護し、仮想プライベートネットワークをセットアップするための手順について説明します。

2 つのシステム間のトラフィックの保護

この手順を行う前に、任意のアルゴリズムで AH 保護をすでに呼び出しているものとします。また、セキュリティアソシエーションを共有し (すなわち、2 システムの保護を必要とするのは 1 組の SA だけである)、各システムには IP アドレスが 1 つしかないという前提です。

  1. システムコンソールからスーパーユーザーになります。


    注 -

    リモートログインすると、セキュリティ的に重要なトラフィックが盗聴される恐れがあります。何らかの方法でリモートログインを保護していても、システム全体のセキュリティがリモートログインセッションレベルに低下します。


  2. システムごとに、他のシステムのアドレスとホスト名を /etc/hosts ファイルに追加します。次のコマンドを使用します。

    1. システム 1 では次のようになります。


      # echo "system2_addr system2_name" >> /etc/hosts
      
    2. システム 2 では次のようになります。


      # echo "system1_addr system1_name" >> /etc/hosts
      

    これで、起動スクリプトでは、存在しないネーミングサービスに依存するようなことなくシステム名を使用できます。

  3. 各システムごとに、次の行を追加して /etc/inet/ipsecinit.conf ファイルを編集します。

    1. システム 1 では次のようになります。


      {saddr system1_name daddr system2_name} apply {auth_algs any sa shared}
      {saddr system2_name daddr system1_name} permit {auth_algs any}
    2. システム 2 では次のようになります。


      {saddr system2_name daddr system1_name} apply {auth_algs any sa shared}
      {saddr system1_name daddr system2_name} permit {auth_algs any}
  4. 次の操作でセキュリティアソシエーションを追加します。

    1. たとえば MyKeyfile のように、選択したファイル名で、システムごとに読み取り専用 (600 のアクセス権) keyfile を作成し、このファイルに次の行を入力します。


      add ah spi random-number dst system1_name authalg algorithm_name ¥
      	    authkey random-hex-string-of-algorithm-specified-length
      add ah spi random-number dst system2_name authalg algorithm_name ¥
      	    authkey random-hex-string-of-algorithm-specified-length
      
    2. 次のコマンドを入力して、システムごとにセキュリティアソシエーションを有効にします。


      # ipseckey -f keyfile
      
  5. システムごとに次のどれかの操作をします。

    1. 次のコマンドを入力して、ipsecinit.conf ファイルを呼び出します。


      # ipsecconf -a /etc/inet/ipsecinit.conf
      
    2. または両方のシステムをリブートします。

      両方のシステムをリブートする場合、起動スクリプトにまず次のコマンド (手順 4 で使用) を入力します。


      ipseckey -f keyfile
      

      そのためには、次の操作をします。

    3. 次のコマンドを入力して keyfile 名を ipseckey に変更します。


      # cp keyfile /etc/inet/ipseckey
      
    4. 次のコマンドを入力して ipseckey ファイルを読み取り専用にします。


      # chmod 600 /etc/inet/ipseckey
      
    5. 次のコードを組み込んだ起動スクリプト /etc/rc3.d/s99ipsec_setup を作成します。


      if [ -f /etc/inet/ipseckeys -a -f /etc/inet/ipsecinit.conf ]; then
           /usr/sbin/ipseckey -f /etc/inet/ipseckeys
      fi

      以後のリブートでは、起動プロセスの終了前に、/etc/inet/ipseckeys ファイルが読み取られます。キーを変更する場合は、両方のシステムでファイルが変更されていることを確認してください。

IPsec ポリシーによる Web サーバーの保護

この手順では、Web サーバーで処理する Web トラフィックと、この Web サーバーからの DNS クライアント要求の省略 (bypass) について説明します。他のすべてのトラフィックには、3DES アルゴリズムと SHA-1 アルゴリズムでは ESP を要求し、出力トラフィックに共有 SA を使用し、セキュリティアソシエーションが多くなり過ぎないようにします。

  1. システムコンソールからスーパーユーザーになります。


    注 -

    リモートログインすると、セキュリティ的に重要なトラフィックが盗聴される恐れがあります。何らかの方法でリモートログインを保護していても、システム全体のセキュリティがリモートログインセッションレベルに低下します。


  2. セキュリティポリシー検査を省略するサービスを指定します。

    Web サーバーの場合、TCP ポート 80 (HTTP) と 443 (保護 HTTP) が該当します。Web サーバーが DNS 名検査をしないときは、TCP と UDP の両方にポート 53 も組み込む必要がある場合もあります。

  3. たとえば MyIPsecInitFile のように、選択したファイル名で読み取り専用ファイルを作成し、このファイルに次の行を入力します。


    # Web traffic that Web server should bypass.
    	{sport 80 ulp tcp} bypass {dir out}
    	{dport 80 ulp tcp} bypass {dir in}
    	{sport 443 ulp tcp} bypass {dir out}
    	{dport 443 ulp tcp} bypass {dir in}
    
    	# Outbound DNS lookups should also be bypassed.
    	{dport 53} bypass {dir out}
    	{sport 53} bypass {dir in}
    
    	# Require all other traffic to use ESP with 3DES and SHA-1.
    	# Use a shared SA for outbound traffic, so as not to require a
    	# large supply of security associations.
    	{} permit {encr_algs 3des encr_auth_algs sha}
    	{} apply {encr_algs 3des encr_auth_algs sha sa shared}

    これで、保護トラフィックだけがシステムをアクセスするようになります。ただし先の手順で省略するようにリストしたトラフィックは例外です。

  4. 2 つの操作のどちらかを実行します。

    1. 先の手順で作成したファイルを、/etc/inet/ipsecinit.conf にコピーし、次のコマンドでリブートします。


      # cp filename /etc/inet/ipsecinit.conf
      # reboot
      
    2. 作成したファイルを次のコマンドで呼び出します。


      ipsecconf -a filename
      

      注 -

      このファイルにはネームサービスが必要ないためにこの操作が可能です。また、ipsecconf を呼び出しても、既存の TCP 接続には IPsec ポリシーが適用されません。そのため、ipsecconf コマンドを実行すると警告が表示されます。


こうして、Web サーバーでは、Web サーバートラフィックと出力 DNS 要求と応答だけを処理します。他のサービスは ipseckey(1M) でセキュリティアソシエーションを追加して、IPsec をリモートシステムで有効にしないと機能しません。

仮想プライベートネットワークの構築

この手順では、インターネットで VPN を構築して組織内の 2 つのネットワークを接続し、そのネットワーク間のトラフィックを IPsec で保護する操作について説明します。前提条件として、VPN リンクを実装した 2 つのシステム上で、ネットワークの le1 インタフェースは VPN 内部にあり、le0 インタフェースは VPN 外部にあるものとします。

また、この操作では、DES と MD5 で ESP を使用します。使用するアルゴリズムによってキーの長さが異なり、DES の場合は 64 ビット (56 ビット + 8 ビットパリティ)、MD5 の場合は 128 ビットになります。インターネットでゲートウェイになる 2 つのシステムには、次の操作をします。VPN については、「仮想プライベートネットワークを使用可能にする」を参照してください。

  1. システムコンソールでスーパーユーザーになります。


    注 -

    リモートログインすると、セキュリティ的に重要なトラフィックが盗聴される恐れがあります。何らかの方法でリモートログインを保護していても、システム全体のセキュリティがリモートログインセッションレベルに低下します。


  2. 次のコマンドを入力して IP 送信をオフにします。


    # ndd -set /dev/ip ip_forwarding 0
    

    IP 送信をオフにすると、このシステムを経由したネットワーク間のパケット送信ができなくなります。

  3. 次のコマンドを入力して IP の厳密宛先マルチホームをオンにします。


    # ndd -set /dev/ip ip_strict_dst_multihoming 0
    

    IP 厳密宛先マルチホームをオンにすると、システムの宛先アドレスのうちの 1 つに宛てたパケットは、そのアドレスを割り当てたインタフェースに必ず到着します。

    ndd(1M) コマンドを使用して IP 送信をオフにし、IP 厳密宛先をオンにすると、マルチホームによってシステム自体へのパケット以外はすべてパケットがシャットダウンされ、宛先 IP アドレスに対応するインタフェースにだけパケットが到着します。

  4. 次の手順で、必要に応じて Solaris システム上のほとんどの (すべてでなければ) ネットワークサービスを無効にします。


    注 -

    VPN ルーターは、ほとんどの入力要求を受け付けません。入力トラフィックを受け付けるすべてのプロセスを無効にするか (inetd.conf ファイルの行をコメントにするか、SNMP を終了するなど)、「IPsec ポリシーによる Web サーバーの保護」のような方法を実行する必要があります。


    1. inetd.conf を編集して、重要なサービス以外のすべてのサービスを削除した場合、次のコマンドを入力します。


      # pkill -HUP inetd
      
    2. 重要なサービス以外のすべてのサービスを削除するための inetd.conf の編集がまだの場合は、次のコマンドを入力します。


      # pkill inetd
      
    3. 必要に応じて、次の例のようなコマンドを 1 つまたは複数入力して SNMP、NFS など他のインターネットサービスを無効にします。


      # /etc/init.d/nfs.server stop
      # /etc/init.d/sendmail stop
      

      ネットワークサービスを無効にすると、IP パケットによるシステムへの妨害がなくなります。たとえば、SNMP デーモン、telnet、rlogin を最大限に活用できます。

  5. 次の操作で、各システムごとに 2 つのシステム間のセキュリティアソシエーションの組を追加します。

    1. 次のコマンドを入力します。


      # ipseckey
      

      ipseckey コマンドモードが有効になります。

    2. ipseckey コマンドモードプロンプトで、次のコマンドを入力します。


      > add esp spi random-number src system1_addr dst system2_addr ¥
      auth_alg md5 encr_alg des ¥
      authkey very-random-hex-string-of-32-characters ¥
      encrkey very-random-hex-string-of-16-characters
      
    3. Return キーを押します。

      コマンドが実行され、ipseckey コマンドモードプロンプトが再表示されます。

    4. ipseckey コマンドモードプロンプトで、次のコマンドを入力します。


      > add esp spi random-number src system2_addr dst system1_addr ¥
      auth_alg md5 encr_alg des ¥
      authkey very-random-hex-string-of-32-characters ¥
      encrkey very-random-hex-string-of-16-characters
      

      注 -

      キーと SPI は、セキュリティアソシエーションごとに変更できますが、同じにしてはいけません。


    5. ipseckey コマンドモードプロンプトで、Ctrl-D または Exit キーを入力してこのモードを終了します。

  6. 次の手順で保護トンネル ip.tun0 を設定します。

    1. システム 1 で、次のコマンドを入力します。


      # ifconfig ip.tun0 plumb
      
      # ifconfig ip.tun0 system1-taddr system2-taddr ¥
      tsrc system1-addr tdst system2-addr encr_algs des encr_auth_algs md5
      
      # ifconfig ip.tun0 up
      
    2. システム 2 で、次のコマンドを入力します。


      # ifconfig ip.tun0 plumb
      
      # ifconfig ip.tun0 system2-taddr system1-taddr ¥
      tsrc system2-addr tdst system1-addr encr_algs des encr_auth_algs md5
      
      # ifconfig ip.tun0 up
      

    保護トンネルが構築され、IP からみたもう 1 つの物理的インタフェースが追加されます。

  7. システムごとに次のコマンドを入力して le1:ip_forwardingip.tun0:ip_forwarding をオンにします。


    # ndd -set /dev/ip le1:ip_forwarding 1
    
    # ndd -set /dev/ip ip.tun0:ip_forwarding 1
    

    ip_forwarding は、インタフェースから到着したパケットを転送できることを意味します。またこのインタフェースから転送されるパケットは別のインタフェースが発信元であることを表します。パケットを正しく転送するには、受信インタフェースと送信インタフェースの ip_forwarding をオンにしておきます。

    le1 はイントラネットの内部にあり、ip.tun0 はインターネットを経由して 2 つのシステムを接続するので、これら 2 つのインタフェースでは、ip_forwarding をオンにしておきます。

    le0 インタフェースの ip_forwarding はまだオフです。そのため、外部 (インターネット内) からパケットが保護イントラネットに侵入するのを防ぐことができます。

  8. システムごとに次のコマンドを実行して、ルーティングプロトコルによってイントラネット内のデフォルトのルートが通知されていないことを確認します。


    # ifconfig le0 private
    

    le0ip_forwarding がオフになっていても、ルーティングプロトコルの実装のどれか (in.routed など) で、le0 がイントラネット内のピアにパケットを転送するときの有効なインタフェースであることが通知されている可能性があります。インタフェースの private フラグを設定すれば、この通知を削減できます。

  9. システムごとに次のコマンドを実行して、le0 経由のデフォルトルートを手動で追加します。


    # pkill in.rdisc
    
    # route add default router-on-le0-subnet
    

    le0 はイントラネットの一部ではありませんが、インターネットを介してそのピアマシンにアクセスする必要があります。そのため、インターネットルーティング情報が必要です。インターネットの残りの要素にとって、VPN システムはルーターに対するホストのようなものなので、デフォルトルーターを使用するか、ルーター発見を実行すれば十分です。

  10. システムが再起動するときに、in.rdisc が再開するのを防ぐため次の操作をします。

    1. le0 サブネットのデフォルトルーターの IP アドレスを /etc/defaultrouter ファイルに指定します。

      これで、in.rdisc がリブート時に開始しなくなります。

    2. 次のコマンドを入力します。


      # touch /etc/notrouter
      

      起動シーケンスの初期にルーティングが打ち切られ、防備が強化されます。

    3. /etc/hostname.ip.tun0 ファイルを編集して次の行を追加します。


      system1-taddr system2-taddr tsrc system1-addr ¥
           tdst system2-addr encr_algs des encr_auth_algs md5
    4. /etc/rc3.d/S99ipsec_setup ファイルを編集して、最後に if/then 文に次の行を追加します。


      ndd -set /dev/ip le1:ip_forwarding 1
      ndd -set /dev/ip ip.tun0:ip_forwarding 1
      ifconfig le0 private
      in.routed

      ファイルは次のようになります。


      if [ -f /etc/inet/ipseckeys -a -f /etc/inet/ipsecinit.conf ]; then
           /usr/sbin/ipseckey -f /etc/inet/ipseckeys
           ndd -set /dev/ip le1:ip_forwarding 1
           ndd -set /dev/ip ip.tun0:ip_forwarding 1
           ifconfig le0 private
           in.routed
      fi
  11. システムごとに、次のコマンドを実行してルーティングプロトコルを実行します。


    # in.routed
    

暗号システムの不正侵入者の時間的な余裕をなくすため、手順 2 で呼び出すセキュリティアソシエーションは定期的に新しいアソシエーションに変更します。現在のセキュリティアソシエーションを変更するには、次のように操作します。

現在のセキュリティアソシエーションの変更

この手順では、現在のセキュリティアソシエーションを変更します。暗号システムの不正侵入者の時間的な余裕をなくすためにこの操作をします。

  1. システムコンソールからスーパーユーザーになります。


    注 -

    リモートログインすると、セキュリティ的に重要なトラフィックが盗聴される恐れがあります。何らかの方法でリモートログインを保護していても、システム全体のセキュリティがリモートログインセッションレベルに低下します。


  2. システムごとに、次のコマンドを入力して現在のセキュリティアソシエーションをフラッシュします。

    1. 次のコマンドを入力します。


      # ipseckey
      

      ipseckey コマンドモードが有効になります。

    2. ipseckey コマンドモードプロンプトで、次のコマンドを入力します。


      > flush
      
  3. 「仮想プライベートネットワークの構築」の手順 5 を実行し、SPI とキーの値を変更して新しいセキュリティアソシエーションを設定します。