BIG-IP iruleでクライアントがTLS 1.1以下でアクセスしたときに別poolに振り分ける

PCI-DSS 絡みとかでTLS 1.1 以下が徐々に閉鎖されていっているなか、あらかじめWebページで告知したとしてもやはり接続してくるクライアントは一定数いてそうなので救済策を考えて見た。


TLS のバージョンはCLIENTSSL_HANDSHAKE eventで SSL::cipher version で取得できる。
(SSL3.0以下はclient-ssl profile で落としているのでここでは考慮しない)

VirtualServer にはdefaultでpoolが既に割り当てられているとする。

  • irule
when CLIENTSSL_HANDSHAKE {
    if { ( [SSL::cipher version] equals "TLSv1" ) or ( [SSL::cipher version] equals "TLSv1.1" ) } {
        pool another-https-pool
    }
}

もし、複数のVirtualServer があって、個別にirule 作るのが面倒な場合、
TLS 1.1以下のときに振るpool の命名規則さえ揃えておけば

when CLIENTSSL_HANDSHAKE {
    if { ( [SSL::cipher version] equals "TLSv1" ) or ( [SSL::cipher version] equals "TLSv1.1" ) } {
        pool [LB::server pool]-oldtls
    }
}

みたいにすれば、

のようにpool作れば、irule使い回しできそう。

ちなみにpoolが存在しない場合、clientからの接続は切断されて、/var/log/ltm にログが出る。

TCL error: /Common/tls_version_routing_test <CLIENTSSL_HANDSHAKE> - no such pool: /Common/example.com-https-oldtls (line 1)     invoked from within "pool [LB::server pool]-oldtls"