Project

General

Profile

httpsのセキュリティを測定・設定する

httpsを使用することでWebサーバと暗号化通信を行うが、デフォルトの設定では
複合化される恐れのある暗号方式を利用することもあるため、細かく設定を行う
必要がある。

セキュリティレベルを測定する

次のシステムでサイトのセキュリティを「A~F」段階で測定することができる。

httpdのSSL設定の観点

「/etc/httpd/conf.d/ssl.conf」の次の設定でセキュリティの設定を行う。

サイトの公開形式によっては、VirtualHostディレクティブ内にある場合に効果が出ない場合もあるので、
上記の測定を行いながらVirtualHostディレクティブ外に設定すると設定が適用される場合がある。

  • SSLProtocol
    「SSLv2、SSLv3、TLSv1、TLSv1.1、TLSv1.2」から使用するSSLおよびTLS暗号化方式を設定する。
    「SSLv2」「SSLv3」には脆弱性があるため「TLSv1」以降を利用することが望ましい。
  • SSLHonorCipherOrder
    暗号化スイートの指定をサーバ/クライアントどちらで行うかをしているする。
    デフォルトの「Off」はクライアント側が暗号化スイートを選択するため、解読されやすい
    方式を使用する可能性がある。
    「On」にしてサーバ側で暗号化スイートを選択することで解読されにくい方式を強制すること
    が望ましいが、古いブラウザでは暗号がスイートに対応していない可能性が稀にあるため注意。
  • SSLCipherSuite
    サーバ側で利用する暗号化スイートを定義する。かなり細かい設定ができるため、ここが
    セキュリティ設定の要となる。
    本設定では記載する順番および接頭に以下の識別子を付けることで以下の設定を意味する。
    順番:先頭から判定を行う
    識別子なし:指定した暗号化スイートを追加する
    -:指定した暗号化スイートを削除するが、後方で追加した場合は追加される
      (特定の暗号方式を含むものを一度すべて削除し、特定パターンのみ後から許可するなど)
    !:指定した暗号化スイートを削除する。後方で追加することはできない
    +:指定した暗号化スイートをこの判定位置に追加する
    

    デフォルト値は「ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW」で、以下の内容となる。
    ALL  すべての暗号化方式を追加
    !ADH    匿名形式を削除
    !EXPORT 40ビット暗号方式を削除
    !SSLv2  SSLv2暗号方式を削除
    RC4+RSA RC4+RSAを使用する暗号方式を追加
    +HIGH   128ビットのAESおよび3DES等の暗号方式を追加
    +MEDIUM 128ビットのRC4およびSEED等の暗号方式を追加
    +LOW    56ビットまたは64ビット低強度暗号方式を追加
    
  • SSLCipherSuiteに設定する値について
    設定する値については、「openssl ciphers -v 'ALL'」で確認することができる。「'ALL'」
    部分を上記識別子を組み合わせた設定値を指定することで、利用できる暗号化スイートを
    確認することができる。
    設定の基準としては、総務省及び経済産業省が公開している「CRYPTREC暗号リスト」に則った
    設定を行ったうえで、「SSL Server Test」でさらに「WEAK」と判断されたものを個別に削除する。
    電子政府における調達のために参照すべき暗号のリスト(CRYPTREC暗号リスト)
    「WEAK」と表示された方式はそのままの内容で指定はできないので、前述のopenssl
    コマンドで内容を突き合わせて設定すべき値をマッチングする必要がある。
    ■SSL Server TestのWEAK結果
    TLS_RSA_WITH_AES_256_GCM_SHA384 (0x9d)   WEAK    256
    TLS_RSA_WITH_AES_256_CBC_SHA256 (0x3d)   WEAK    256
    
    ■opensslコマンドに現在のSSLCipherSuiteの値を指定して実行
    # openssl ciphers -v 'ALL:!ADH:!EXPORT:!SSLv2:!SSLv3:!RC4:!3DES:+HIGH:!MEDIUM:!LOW'
    ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
    ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
    ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA384
    ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA384
    DHE-DSS-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=DSS  Enc=AESGCM(256) Mac=AEAD
    DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(256) Mac=AEAD
    DHE-RSA-AES256-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA256
    DHE-DSS-AES256-SHA256   TLSv1.2 Kx=DH       Au=DSS  Enc=AES(256)  Mac=SHA256
    ECDH-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(256) Mac=AEAD
    ECDH-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(256) Mac=AEAD
    ECDH-RSA-AES256-SHA384  TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AES(256)  Mac=SHA384
    ECDH-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AES(256)  Mac=SHA384
    AES256-GCM-SHA384       TLSv1.2 Kx=RSA      Au=RSA  Enc=AESGCM(256) Mac=AEAD
    AES256-SHA256           TLSv1.2 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA256
    ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
    ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(128) Mac=AEAD
    ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA256
    ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA256
    DHE-DSS-AES128-GCM-SHA256 TLSv1.2 Kx=DH       Au=DSS  Enc=AESGCM(128) Mac=AEAD
    DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(128) Mac=AEAD
    DHE-RSA-AES128-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA256
    DHE-DSS-AES128-SHA256   TLSv1.2 Kx=DH       Au=DSS  Enc=AES(128)  Mac=SHA256
    ECDH-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(128) Mac=AEAD
    ECDH-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(128) Mac=AEAD
    ECDH-RSA-AES128-SHA256  TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AES(128)  Mac=SHA256
    ECDH-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AES(128)  Mac=SHA256
    AES128-GCM-SHA256       TLSv1.2 Kx=RSA      Au=RSA  Enc=AESGCM(128) Mac=AEAD
    AES128-SHA256           TLSv1.2 Kx=RSA      Au=RSA  Enc=AES(128)  Mac=SHA256
    
    ■上記のうち下記がマッチしたと推測される。
    TLS_RSA_WITH_AES_256_GCM_SHA384 (0x9d)   WEAK    256
    ↓
    AES256-GCM-SHA384       TLSv1.2 Kx=RSA      Au=RSA  Enc=AESGCM(256) Mac=AEAD
    
    TLS_RSA_WITH_AES_256_CBC_SHA256 (0x3d)   WEAK    256
    ↓
    AES256-SHA256           TLSv1.2 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA256
    
    ■次の削除設定値が導き出される。
    !AES256-GCM-SHA384
    !AES256-SHA256
    
    ■もとの設定値に追加する
    ALL:!ADH:!EXPORT:!SSLv2:!SSLv3:!RC4:!3DES:+HIGH:!MEDIUM:!LOW:!AES256-GCM-SHA384:!AES256-SHA256
    
    

    かいつまんで言うと、128ビット未満の暗号化方式、RC4、3DES、SSLv3までの方式を削除する。
  • SSLCipherSuite設定例
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:!SSLv3:!RC4:!3DES:+HIGH:!MEDIUM:!LOW:!AES256-GCM-SHA384:!AES256-SHA256
    

DNSの設定

DNSに「CAA」レコードが存在しない場合、証明書のCAA部分で警告が発生する。

DDNSなどでは設定できない場合もあるが設定できる場合は下記を設定する。
複数のCAAレコードを登録できない場合もあるので、その場合は1行目だけでも何とかなるみたい。
証明書発行機関名は発行機関のサイトを参照だが、例えばletsencryptだと「letsencrypt.org」となる。

*    IN    CAA    0 issue "証明書発行機関名" 
*    IN    CAA    0 issuewild ";" 
*    IN    CAA    0 iodef "mailto:サイト責任者のメールアドレス" 

これらを繰り返し行うことで、セキュリティ判定が「A~A+」くらいにはなると思われる。