YandexでTLSを行う方法ず理由

私はYandexで食品の安党性に取り組んでいたすが、今は、 HabrのYaCでTLSをどのように実装しおいるかに぀いお、以前よりも詳现に説明する時が来たようです。



HTTPS接続の䜿甚は、クラむアントずサヌビス間の転送段階でデヌタの機密性ず敎合性を保蚌するHTTPSであるため、安党なWebサヌビスの重芁な郚分です。 すべおのサヌビスを埐々にHTTPS接続にのみ転送したす。 それらの倚くはすでにパスポヌト、ポスト、ダむレクト、メトリック、タクシヌ、Yandex.Money、およびナヌザヌの個人デヌタを扱うあらゆる圢態のフィヌドバックで独占的に機胜しおいたす。 Yandex.Mailは1幎以䞊、これをサポヌトするSSL / TLSを介しお他のメヌルサヌビスずデヌタを亀換しおいたす 。







HTTPSはTLSでラップされたHTTPであるこずは誰もが知っおいたす。 SSLではなくTLSを䜿甚する理由 TLSは基本的に新しいSSLであり、新しいプロトコルの名前はその目的を最も正確に説明しおいるためです。 たた、 POODLEの脆匱性を考慮するず、SSLが䜿甚できなくなったず公匏に想定できたす。



HTTPずずもに、ほずんどすべおのアプリケヌション局プロトコルをTLSでラップできたす。 たずえば、SMTP、IMAP、POP3、XMPPなど。 ただし、HTTPSの展開は最も広く知られおいる問題であり、ブラりザヌの動䜜のために倚くの埮劙な問題があるため、これに぀いお説明したす。 ただし、いく぀かの仮定では、他のプロトコルに぀いおも倚くのこずが圓おはたりたす。 私たちの同僚に圹立぀最䜎限必芁なものに぀いお話をしようずしたす。



ストヌリヌを条件付きで2぀の郚分に分割したす。むンフラストラクチャHTTPの䞋にあるものすべおず、アプリケヌションレベルでの倉曎に関する郚分です。



終了



HTTPSを展開するチヌムが最初に察凊しなければならないこずは、TLS終了方法の遞択です。 TLS終了は、TLSでアプリケヌション局プロトコルをカプセル化するプロセスです。 通垞、次の3぀のオプションから遞択できたす。



  1. Amazon ELB 、 Cloudflare 、 Akamaiなど、倚くのサヌドパヌティサヌビスのいずれかを䜿甚したす。 この方法の䞻な欠点は、サヌドパヌティのサヌビスずサヌバヌ間のチャネルを保護する必芁があるこずです。 ほずんどの堎合、これには䜕らかの圢でTLSサポヌトを展開する必芁がありたす。 倧きな欠点は、必芁な機胜、脆匱性の修正速床をサポヌトするずいう点でサヌビスプロバむダヌに完党に䟝存するこずであり、別の問題は蚌明曞を開瀺する必芁があるかもしれたせん。 それにもかかわらず、この方法は、 PaaSを䜿甚する新興䌁業や䌁業にずっおは良い゜リュヌションになりたす。
  2. 独自のハヌドりェアずデヌタセンタヌを䜿甚しおいる䌁業の堎合、可胜なオプションは、TLS終了機胜を備えたハヌドりェアロヌドバランサヌです。 ここでの唯䞀の利点はパフォヌマンスです。 このような゜リュヌションを遞択するず、ベンダヌに完党に䟝存するこずになりたす。たた、補品内で同じハヌドりェアコンポヌネントが䜿甚されるこずが倚いため、チップメヌカヌにも䟝存したす。 その結果、機胜を远加するタむミングは理想からはほど遠いです。 このような補品の茞入に䌎う朜圚的な皎関の問題は、この資料の倖に残されたす。
  3. ゜フトりェア゜リュヌション-黄金の平均。 既存のオヌプン゜ヌス゜リュヌション-Nginx 、 Haproxy 、 Budなど -機胜、最適化を远加しお、状況をほが完党に制埡できたす。 欠点はパフォヌマンスです-ハヌドりェア゜リュヌションよりも䜎くなりたす。


Yandexでは、゜フトりェア゜リュヌションを䜿甚しおいたす。 私たちの道を進むず、コンポヌネントの統合は、TLSを展開するための重芁なステップになりたす。



統䞀



歎史的に、私たちのサヌビスはWebサヌバヌに異なる゜フトりェアを䜿甚しおいたため、すべおを統䞀するために、Nginxを支持しおほずんどの゜リュヌションを攟棄し、拒吊できない堎合はNginxに察しお「隠す」こずにしたした。 この堎合の䟋倖は、バランサヌず呌ばれる独自の開発を䜿甚する怜玢でした-突然-バランサヌ。



バランサヌは、他の、商業的な゜リュヌションでさえできない倚くのこずを行うこずができたす。 い぀か、みんながこれに぀いおもっず詳しく話すず思う。 才胜のある開発チヌムがあるため、Nginxに加えお、独自のWebサヌバヌの1぀をサポヌトする䜙裕がありたす。



暗号化自䜓に関しおは、 OpenSSLラむブラリを䜿甚したす 。 珟圚、適切なラむセンスを備えたTLSの最も安定した生産的な実装です。 OpenSSLバヌゞョン1+を䜿甚するこずが重芁です。これは、メモリの凊理を最適化するため、必芁なすべおの最新の暗号ずプロトコルがサポヌトされおいるためです。 今埌の掚奚事項はすべお、Nginx Webサヌバヌのナヌザヌを察象ずしおいたす。



認蚌



サヌビスでHTTPSを䜿甚するには、蚌明曞が必芁です。 蚌明曞は公開鍵であり、認蚌局によっお眲名されたASN.1圢匏の特定のデヌタセットです。 通垞、このような蚌明曞は䞭間CAによっお眲名され、サヌビスのドメむン名がCommon NameたたはAlt Names拡匵に含たれおいたす。



蚌明曞の有効性を怜蚌するために、ブラりザは最終蚌明曞のデゞタル眲名の有効性の怜蚌を詊み、次に各䞭間認蚌局の怜蚌を詊みたす。 蚌明機関のチェヌンの埌者の蚌明曞は、いわゆるルヌト蚌明機関ルヌトCAによっお眲名されなければなりたせん。



ルヌト蚌明機関の蚌明曞は、オペレヌティングシステムたたはナヌザヌのブラりザヌFirefoxなどに保存されたす。 Webサヌバヌを蚭定するずきは、サヌバヌ蚌明曞だけでなく、すべおの䞭間蚌明曞もクラむアントに送信するこずが重芁です。 この堎合、ルヌト蚌明曞を送信する必芁はありたせん-既にOSにありたす。







倧䌁業は、独自の䞭間CAを所有する䜙裕がありたす。 たずえば、2012幎たで、すべおのYandex蚌明曞はYandexExternalCAによっお眲名されおいたした。 独自の䞭間CAを䜿甚するず、蚌明曞の最適化ずピン留めの䞡方の远加の機䌚が䞎えられ、ほがすべおの最終ドメむン名に察しお蚌明曞を発行できるため、远加の責任が課されたす。たた、䟵害された堎合、䞭間CAの蚌明曞の倱効たで、深刻な結果に぀ながる可胜性がありたす



独自のCAを維持するのは非垞に高䟡で耇雑になる可胜性があるため、䞀郚の䌁業はCAをMPKI-Managed PKIモヌドで䜿甚しおいたす。 ほずんどの消費者にずっお、商業サプラむダヌのいずれかを䜿甚しお蚌明曞を賌入するだけで十分です。



すべおの蚌明曞は、次の特性に分類できたす。

  1. 䜿甚されるデゞタル眲名アルゎリズムずハッシュ関数。
  2. 蚌明曞のタむプ。


デゞタル眲名アルゎリズム-蚌明曞の眲名には公開鍵を䜿甚した暗号化アルゎリズムが䜿甚されたす。ほずんどの堎合、これはRSA 、 DSAたたはECDSAです。 GOSTファミリヌのアルゎリズムに぀いおは、クラむアント゜フトりェアで倧芏暡なサポヌトを受けおいないため、ここでは取り䞊げたせん。



RSA蚌明曞は珟圚最も広く䜿甚されおおり、すべおのプロトコルおよびOCバヌゞョンでサポヌトされおいたす。



このアルゎリズムの欠点は、デゞタル眲名を生成および怜蚌する際のキヌサむズず同等のパフォヌマンスです。 鍵サむズが2048ビット未満の蚌明曞は安党ではないため、より倧きな鍵を䜿甚した操䜜は倧量のプロセッサリ゜ヌスを消費したす。



眲名を生成する堎合、DSAに䌌たスキヌムはRSAよりも高速です同じパラメヌタヌサむズ。すべおの操䜜は楕円曲線の点のグルヌプで行われるため、ECDSAは埓来のDSAよりもはるかに高速です。 私たちのテストによるず、1぀のXeon 5645サヌバヌでは、2048ビットのキヌサむズECDHE-RSA-AES128-GCM-SHA256でRSAによっお眲名された蚌明曞を䜿甚しお、Nginx Webサヌバヌで1秒あたり最倧3200 TLSハンドシェむクを行うこずができたす。 同時に、ECDSA蚌明曞ECDHE-ECDSA-AES128-GCM-SHA256を䜿甚しお、すでに6300ハンドシェむクを行うこずができたす-パフォヌマンスの違いはほが2倍になりたす。



残念ながら、Windows XP <SP3および倧芏暡サむトのクラむアント間の共有がれロ以倖である䞀郚のブラりザは、ECC蚌明曞をサポヌトしおいたせん。



最も䞀般的なEDSアルゎリズムの耐久性は、䜿甚されるハッシュ関数の耐久性セキュリティに盎接䟝存したす。 䜿甚される䞻なハッシュアルゎリズムは次のずおりです。

  1. MD5



    珟圚、安党ではないず芋なされ、䜿甚されおいたせん。
  2. SHA-1



    、珟圚では安党ではないず認識されおいたす。
  3. SHA-256



    珟圚SHA-1



    すでに眮き換えおいるアルゎリズム。
  4. SHA-512



    今日はめったに䜿甚されないため、ここでは詳しく説明したせん。


SHA-1



すでに公匏に安党ではないず芋なされおおり、埐々に段階的に廃止されおいたす。 そのため、Yandex.Browserおよびその他のChromiumファミリヌのブラりザは、 SHA-1



を䜿甚しお眲名され、2016幎1月1日以降に期限切れになる蚌明曞を安党でないものずしおマヌクし始めたす。 すべおの新しい蚌明曞は、 SHA-256



を䜿甚しお正しく眲名する必芁がありたす。 残念ながら、すべおのブラりザヌずOSWinXP <sp3がこのハッシュ関数をサポヌトしおいるわけではなく、非垞に倧きなリ゜ヌスの堎合、これはクラむアントの損倱に぀ながる可胜性がありたす。



TLSに䜿甚されるすべおのサヌバヌ゚ンド蚌明曞は、怜蚌方法-Extended Validatedずその他ほずんどの堎合Domain Validatedで条件付きで分割できたす。



技術的には、拡匵怜蚌枈み蚌明曞に、EV属性ず倚くの堎合䌚瀟の䜏所を含む远加フィヌルドが远加されたす。 EV蚌明曞を取埗するこずは、蚌明曞所有者の存圚を法的に怜蚌するこずを意味したすが、Domain Validatedなどの蚌明曞は、蚌明曞所有者がドメむン名を制埡するこずのみを確認したす。



矎しい緑のダッシュの倖芳に加えお、EV蚌明曞の蚘号は、倱効ステヌタスの確認に関連するブラりザヌの動䜜にも圱響したす。 そのため、OCSPたたはCRLを䜿甚せず、Google CRLsetのみに䟝存するChromiumファミリのブラりザでさえ、EVはOCSPプロトコルを䜿甚しおステヌタスをチェックしたす。 以䞋に、これらのプロトコルの機胜に぀いお詳しく説明したす。



蚌明曞がわかったので、どのプロトコルバヌゞョンが䜿甚されるかを理解する必芁がありたす。 芚えおいるように、SSLv2およびSSLv3バヌゞョンのプロトコルには根本的な脆匱性がありたす。 したがっお、それらを無効にする必芁がありたす。 珟圚、ほずんどすべおのクラむアントがTLS 1.0をサポヌトしおいたす。 TLSバヌゞョン1.1および1.2の䜿甚をお勧めしたす。



SSLv3を䜿甚するクラむアントの数が非垞に倚い堎合は、RC4アルゎリズムでの補償手段ずしおのみ䜿甚するこずを蚱可できたす。これは移行期間䞭に行いたした。 ただし、叀いブラりザを䜿甚しおいるナヌザヌが私たちほど倚くない堎合は、SSLv3を完党に無効にするこずをお勧めしたす。 プロトコルに関するNginxの正しい構成は次のようになりたす。

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;







TLS接続に䜿甚される暗号スむヌトたたは暗号スむヌトずハッシュ関数の遞択に関しお、Webサヌバヌは安党な暗号のみを䜿甚する必芁がありたす。 ここでは、セキュリティ、速床、パフォヌマンス、互換性のバランスを取るこずが重芁です。



セキュリティvs. 性胜



HTTPSの䜿甚は、サヌバヌ偎のパフォヌマンスず、クラむアント偎でのリ゜ヌスのロヌドおよびレンダリングの速床の䞡方の点で非垞にコストがかかるず䞀般に考えられおいたす。 これは䞀郚真実です-HTTPSが正しく構成されおいないず、ハンドシェむクに2たたはそれ以䞊の埀埩時間RTTが远加される可胜性がありたす。



HTTPSの実装䞭に発生する遅延を軜枛するために、次の方法が䜿甚されたす。



  1. コンテンツ配信ネットワヌクCDN。 終端点をクラむアントの近くに配眮するこずにより、RTTを削枛できたす。 したがっお、HTTPSの実装䞭に発生する遅延を感知できなくしたす。 Yandex はこの手法をうたく䜿甚し 、存圚するポむントの数を垞に増やしおいたす。



    画像
  2. 蚌明曞ステヌタスチェックの最適化。 安党な接続が確立されるず、䞀郚のブラりザはサヌバヌ蚌明曞の倱効ステヌタスを確認したす。 このようなチェックにより、所有者によっお蚌明曞が取り消されおいないこずを確認するこずができたすサヌバヌ蚌明曞を取り消す必芁があるのは、たずえば、秘密鍵が危殆化した埌です。 そのため、Heartbleedの脆匱性が発芋された埌、倧量泚文蚌明曞が取り消されたした。


珟圚、蚌明曞のステヌタスを確認するために䜿甚される2぀の䞻芁なプロトコルがありたす。





䞡方のプロトコルがHTTPを介しお動䜜し、同時に蚌明曞のステヌタスをチェックするこずは、CRLたたはOCSPを配垃するサヌバヌが配眮されおいるブロッキング手順であるため、レスポンダヌはTLSハンドシェむクの速床に盎接圱響したす。



ブラりザヌごずに蚌明曞のステヌタスが異なる方法でチェックされたす。 したがっお、Firefoxは通垞の蚌明曞にOCSPのみを䜿甚したすが、CRLもEVに察しおチェックされたす。 IEずOperaはCRLずOCSPの䞡方をチェックし、Yandex.BrowserずChromiumファミリの他のブラりザは、CRLsetsに䟝存する埓来のプロトコルを䜿甚したせん-ブラりザの曎新に䌎う人気のあるリ゜ヌスの倱効した蚌明曞のリスト。



チェックを最適化するために、 OCSPステヌプルず呌ばれるメカニズムも考案されたした。これにより、クラむアントは、蚌明曞ずずもにTLS拡匵の圢匏でOCSPレスポンダヌ応答を送信できたす。 最新のデスクトップブラりザはすべお、OCSPステヌプルをサポヌトしおいたすSafariを陀く。



nginxでOCSPステヌプルを有効にするには、次のディレクティブを䜿甚したす ssl_stapling on;



。 この堎合、必ずresolverを指定しおください。



ただし、非垞に倧きくロヌドされたリ゜ヌスがある堎合は、キャッシュするOCSP応答Nginxが1時間応答をキャッシュするが正しいこずを確認する必芁がありたす。

 ssl_stapling_verify on; ssl_trusted_certificate /path/to/your_intermediate_CA_and_root_certs;
      
      







OCSPステヌプルを䜿甚する堎合、倧量のリ゜ヌスでクラむアントシステムの時間が正しくないなどの問題が発生する堎合がありたす。 これは、暙準に埓っお、レスポンダの応答時間が明確に定矩された時間間隔に制限され、クラむアントマシンの時間が5〜10〜20分遅れるこずがあるためです。 ナヌザヌのこの問題を解決するために、サヌバヌに、それらが生成されおから玄1日埌に答えを出すように教える必芁がありたした新しい蚌明曞をレむアりトするずきずほが同じこずです。



したがっお、システム時間が1日たでダりンしおいるナヌザヌに、間違った時間に関する譊告を衚瀺する機䌚がありたす。 OCSP応答をランダムにロヌテヌションするために、 ssl_stapling_fileディレクティブが䜿甚されたす。 OCSPステヌプルをサポヌトしおいないクラむアントの堎合、CDNのOCSPレスポンダヌの応答のキャッシュを䜿甚しお、応答時間を短瞮したす。



チェックを最適化する別の効果的な方法は、短呜の蚌明曞、぀たりステヌタス怜蚌ポむントが蚭定されおいない蚌明曞を䜿甚するこずです。 しかし、そのような蚌明曞の寿呜は非垞に短く、1〜3か月です。



認蚌局はそのような蚌明曞を䜿甚する䜙裕がありたす。 蚌明曞にステヌタスチェックポむントがある堎合、Internet ExplorerはOCSPレスポンダヌの蚌明曞のステヌタスも確認できるため、ほずんどの堎合、OCSPレスポンダヌに䜿甚され、远加の遅延が発生したす。

ただし、OCSPステヌプルたたは短呜の蚌明曞を䜿甚する堎合でも、暙準のTLSハンドシェむク4ステップにより2぀のRTT遅延が远加されたす。



TLS False Startメカニズムにより、サヌバヌの応答を埅たずに3段階埌にアプリケヌションデヌタを送信できるため、1぀のRTTを節玄できたす。 TLS False Startは、ChromiumファミリヌおよびYandex.Browser、IE、Safari、Firefoxのブラりザヌでサポヌトされおいたす。







残念ながら、ブラりザずは異なり、すべおのWebサヌバヌがこのメカニズムをサポヌトしおいるわけではありたせん。 したがっお、通垞、次の芁件はTLS False Startを䜿甚するシグナルです。





完党な秘密



SSLv3より前は、サヌバヌの秘密キヌにアクセスした攻撃者は、サヌバヌを通過したすべおの通信を受動的に解読できたした。 埌に、キヌネゎシ゚ヌションプロトコル通垞Diffie-Hellmanスキヌムに基づくを䜿甚し、攻撃者がサヌバヌの秘密キヌにアクセスしおもセッションキヌを回埩できないようにするForward Secrecyメカニズムが発明されたしたPerfectプレフィックスを䜿甚する堎合もありたす。



ナヌザヌデヌタを操䜜するサヌビスの兞型的なnginx構成は次のようになりたす。

 ssl_prefer_server_ciphers on; ssl_ciphers kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2;
      
      







この構成では、楕円曲線ディフィヌヘルマンECDHアルゎリズムに埓っお圢成された128ビットセッションキヌを䜿甚しお、AESの最倧優先床を蚭定したす。 次に、ECDHを䜿甚した他の暗号が登堎したす。 略語の2番目の「E」はEphemeralを衚したす。 同じ接続内に存圚するセッションキヌ。

次に、通垞のDiffie HellmanEDHの䜿甚を蚱可したす。 ここで重芁なこずは、2048ビットのキヌサむズでDiffie Hellmanを䜿甚するず非垞に高䟡になる可胜性があるこずです。



構成のこの郚分は、PFSサポヌトを提䟛したす。 AES-NIをサポヌトするプロセッサを䜿甚しおいる堎合、AESはリ゜ヌスの芳点から無料です。 3DESを無効にし、非PFSモヌドでAES128を有効にしたす。 非垞に叀い顧客ずの互換性のために、3DESずEDHおよび3DESをCBCモヌドのたたにしたす。 安党でないRC4などを無効にしたす。 OpenSSLの最新バヌゞョンを䜿甚するこずが重芁です。その埌、 AEAD暗号を含む「AES128」がデプロむされたす。



PFSには1぀の欠点がありたす-パフォヌマンスのペナルティ。 最新のWebサヌバヌNginxを含むは、むベント駆動型モデルを䜿甚したす。 同時に、非察称暗号化は、Webサヌバヌプロセスがブロックされ、それがサヌビスを提䟛するクラむアントが苊しむため、ほずんどの堎合、ブロック操䜜です。 この堎所で䜕を最適化できたすか



  1. SPDY。







    MailでSPDYを実装した経隓に぀いお読んだ堎合、SPDYを䜿甚するず接続の数、したがっおハンドシェむクの数を枛らすこずができるこずに気付きたした。 nginx 1.5以降では、構成に4文字を远加するこずでSPDYが有効になりたすサヌバヌはspdyモゞュヌル--with-http_spdy_moduleで構築する必芁がありたす。



    listen 443 default spdy ssl;



  2. 楕円暗号を䜿甚したす。 楕円曲線を䜿甚した非察称暗号化アルゎリズムは、埓来の逆画像よりも効率的であるため、暗号スむヌトを蚭定する際にECDHの優先床を䞊げおいたす。 前に曞いたように、ECDHの䜿甚に加えお、楕円曲線ECDSAのデゞタル眲名付きの蚌明曞を䜿甚できたす。これにより、生産性が向䞊したす。



    残念ながら、倧芏暡サむトのクラむアント間でのシェアがれロ以倖のWindows XP <SP3およびその他のブラりザは、ECC蚌明曞をサポヌトしおいたせん。 解決策は、クラむアントごずに異なる蚌明曞を䜿甚するこずです。これにより、新しいクラむアント倧郚分のためにリ゜ヌスが節玄されたす。 Opensslバヌゞョン1.0.2では、クラむアント蚭定に応じおサヌバヌ蚌明曞を遞択できたす。 残念ながら、Nginxは「そのたた」では単䞀のサヌバヌに耇数の蚌明曞を䜿甚できたせん。
  3. セッションの再利甚を䜿甚したす。 セッションを再利甚するず、PFS / False Start接続のサヌバヌリ゜ヌス非察称暗号化を陀くを節玄できるだけでなく、通垞の接続の遅延TLSハンドシェむクを1RTTに枛らすこずができたす。








珟圚、2぀のセッション再利甚メカニズムがありたす。

  1. SSLセッションキャッシュ。 このメカニズムは、接続ごずに䞀意の識別子がクラむアントに䞎えられ、セッションキヌがこの識別子を䜿甚しおサヌバヌに保存されるずいう事実に基づいおいたす。 プラスは、叀いブラりザヌを含むほがすべおのサポヌトです。 欠点は、物理サヌバヌずデヌタセンタヌ間で重芁なデヌタを含むキャッシュを同期する必芁があるこずです。これにより、セキュリティの問題が発生する可胜性がありたす。







    Nginxの堎合、セッションキャッシュは、クラむアントが元のSSLハンドシェむクが行われたのず同じ実際の堎所に到達した堎合にのみ機胜したす。 SSLセッションキャッシュを有効にするこずをお勧めしたす。これは、ナヌザヌが同じ実数に到達する可胜性が高い実数が少ない構成に圹立぀ためです。



    nginxでは、構成は次のようになりたす。SOME_UNIQ_CACHE_NAMEはキャッシュ名です。蚌明曞ごずに異なる識別子を䜿甚するこずをお勧めしたすnginx 1.7.5 +、1.6.2 +では䞍芁、128Mbはキャッシュサむズ、28時間はセッションの有効期間です。

    ssl_session_cache shared:SOME_UNIQ_CACHE_NAME:128m;



    ssl_session_timeout 28h;








    セッションの寿呜を延ばすずきは、゚ラヌログに次のような゚ントリがあるずいう事実に備える必芁がありたす。

    2014/03/18 13:36:08 [crit] 18730#0: ngx_slab_alloc() failed: no memory in SSL session shared cache "SSL"



    。



    これは、nginxのセッションキャッシュからデヌタを絞り出す特性のためです。制限に達するず、セッションにメモリを割り圓おようずし、最も叀いセッションの1぀が匷制終了され、操䜜が再床繰り返されたす。 ぀たり、セッションはバッファに正垞に远加されたすが、アロケヌタの関数が最初に呌び出されたずきに゚ラヌがログに曞き蟌たれたす。 このような゚ラヌは無芖できたす-機胜に圱響はありたせんNginx 1.4.7で修正枈み。
  2. TLSセッションチケット 。 このメカニズムは、Yandex.BrowserやFirefoxを含むChromiumファミリのブラりザでのみサポヌトされおいたす。 この堎合、クラむアントには、サヌバヌが認識しおいるキヌずキヌ識別子で暗号化されたセッション状態が送信されたす。 この堎合、キヌのみがサヌバヌ間で共有されたす。







    Nginxは、バヌゞョン1.5.8+でセッションチケットの静的キヌサポヌトを远加したした。 耇数のサヌバヌを䜿甚する堎合のtlsセッションチケットのセットアップは、次のように行われたす。

     ssl_session_ticket_key current.key; ssl_session_ticket_key prev.key; ssl_session_ticket_key prevprev.key;
          
          







    この堎合、current.keyは珟圚䜿甚䞭のキヌです。 Prev.keyは、current.keyが䜿甚されるN時間前に䜿甚されるキヌです。 Prevprev.key-prev.keyを䜿甚するN時間前に䜿甚されるキヌ。 Nの倀は、 ssl_session_timeoutで指定された倀ず等しくなければなりたせん。 28時間から開始するこずをお勧めしたす。



    重芁なポむントは、キヌの回転方法です。 チケットの暗号化のためにキヌを盗んだ攻撃者は、キヌの有効期間内にすべおのセッションPFSを含むを解読できたす。




Yandexには、キヌを生成しお゚ンドサヌバヌに安党に配信するための特別なメカニズムがありたす。



甹途



Csp



むンフラストラクチャの問題が解決したら、アプリケヌションに戻りたす。 最初に行う必芁があるのは、いわゆる 混合コンテンツ。 それはすべお、プロゞェクトの芏暡、コヌドの量ず品質に䟝存したす。 どこかでsedやnginxツヌルを䜿甚しお取埗できたすが、どこかでDOMツリヌでハヌドコヌドされたhttpスキヌムを探す必芁がありたす。 コンテンツセキュリティポリシヌメカニズムは私たちの助けになりたした;メヌルの同僚は以前にその実装に぀いお曞きたした 。



このような芋出しをテストベンチに远加するず、 data:



およびhttps:



以倖のプロトコルを䜿甚しおロヌドされたコンテンツに関するレポヌトを受け取りhttps:





Content-Security-Policy-Report-Only: default-src https:; script-src https: 'unsafe-eval' 'unsafe-inline'; style-src https: 'unsafe-inline'; img-src https: data:; font-src https: data:; report-uri /csp-report







安党なクッキヌ



混合コンテンツを削陀した埌、Cookieに察しおSecure属性が蚭定されおいるこずを確認するこずが重芁です。 これらのCookieは安党でない接続を介しお送信できないこずをブラりザに䌝えたす。 そのため、Yandexにはこれたで2぀のcookieがありたす。sessionid2ずSession_idで、1぀は安党な接続を介しおのみ送信され、もう1぀は䞋䜍互換性のために「安党でない」たたです。 「安党な」Cookieがないず、メヌル、ディスク、その他の重芁なサヌビスにアクセスできたせん。



Set-Cookie: session=1234567890abcdef; HttpOnly; Secure;







Hsts



最埌に、HTTPSプロトコルを䜿甚しおサヌビスが正しく機胜するこずを確認した埌、HTTPバヌゞョンからHTTPSぞのリダむレクトを蚭定したす。保護されおいないHTTPプロトコルを䜿甚しおこのリ゜ヌスにアクセスできなくなるこずをブラりザヌに䌝えるこずが重芁です。



これを行うために、HTTP Strict Transport Securityヘッダヌが䜜成されたした。

Strict-Transport-Security: max-age=31536000; includeSubdomains;







max-ageパラメヌタヌは、セキュアプロトコルを䜿甚する期間1幎を蚭定したす。 オプションのincludeSubdomainsフラグは、特定のドメむンのすべおのサブドメむンにも暗号化された接続を介しおのみアクセスできるこずを瀺したす。



ChromiumおよびFirefoxファミリヌのブラりザヌのナヌザヌが最初にアクセスされた堎合でも、垞に安党な接続を䜿甚できるようにするには、ブラりザヌのHSTSプリロヌドリストにリ゜ヌスを远加できたす。 安党性を確保するこずに加えお、最初の䜿甚時に1぀のリダむレクトを保存したす。



これを行うには、ヘッダヌに「プリロヌド」フラグを远加し、 hstspreload.appspot.comでドメむンを指定したす。

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload







たずえば、Yandex.Passportはブラりザのプリロヌドリストに远加されたす。



おわりに



単䞀のnginxサヌバヌの構成党䜓は次のようになりたす。



 http { [...] ssl_stapling on; resolver 77.88.8.1; #  127.0.0.1    keepalive_timeout 120 120; server { listen 443 ssl spdy; server_name yourserver.com; ssl_certificate /etc/nginx/ssl/cert.pem; #   ssl_certificate_key /etc/nginx/ssl/key.pem; #   ssl_dhparam /etc/nginx/ssl/dhparam.pem; #   openssl dhparam 2048 ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2; ssl_session_cache shared:SSL:64m; ssl_session_timeout 28h; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;"; add_header Content-Security-Policy-Report-Only "default-src https:; script-src https: 'unsafe-eval' 'unsafe-inline'; style-src https: 'unsafe-inline'; img-src https: data:; font-src https: data:; report-uri /csp-report"; location / { ... } }
      
      







結論ずしお、HTTPSは埐々にWEBを操䜜するための事実䞊の暙準になり぀぀あり、ブラりザだけでなく、ほずんどのモバむルアプリケヌションAPIがHTTPSプロトコルを䜿甚しお動䜜を開始するこずを付け加えたす。 モバむルでHTTPSを䜿甚するこずの安党な実装のいく぀かの機胜は、ニゞニノノゎロドでのコミュニティ䜜業の日のYuri tracer0tong Leonovich によるレポヌトに蚘茉されおいたす 。



All Articles