こんにちは、AvintonエンジニアのS.Yです。
先日、セキュリティをテーマにした研修を受けた中で特に重要かつ奥が深いと教えられたのがSSLでした。SSLは、最近ではセキュリティ対策として重要視されてサイトを運営する人にとってはもはや常識と呼ばれるまでに浸透しています。
ただ簡単には知っているけど一体どういう仕組みなのか、セキュリティ対策のためにとりあえず導入はしているけど本当のところなぜ大切なのか分からないという意見もあるかと思うので、今回はSSLについて皆さんと一緒に学習していきたいと思います。
1.SSLの概要
まずSSLとはSecure Socket Layerの略でそのままで言うとネット通信をする出入り口であるSocketが存在する層の安全性を確保するための方式のことです。現在では当たり前のようにインターネットを介した商取引や個人情報のやり取りが行われていますがちょっと考えてみるとかなり危険なことを日常で行なっています。しかし、そんな気軽に自分の大事な情報を普段何気なくインターネットに流しても安全に取引を行えるのはSSLが安全性を確保してくれているからです。
2.SSL化の現状
政府・サイバーセキュリティ戦略本部が政府機関等のWebサイトと電子メールにはSSL化するよう義務付ける方向性を生み出しているようです。政府が率先する形でSSL化を常態化するように進めていますが、実際はどれだけのWebサイトがSSL化に対応しているのでしょうか?
こちらのサイトによると国内上場企業のサイト全体で見ると約47%ほどしかSSL化に対応していないという事実があります。上場企業サイトだけでその割合ですからWebサイト全体で見るともっと割合が少なくなります。
ちなみにIT系企業でもSSL化が進んでいるのは55%ほどで業界全体で見ると一番大きな数字にはなりますがSSLが他の業界に比べて身近なIT系企業の半数がまだSSL化に対応していないということになり、セキュリティの重要性は頭でわかっているけど行動には移していないのが数字として現れています。
因みに2014年8月にGoogleからWebサイトが常時SSL化を施していないと検索結果で上位にでることはないと発表して以来、SSL化しているサイトを優遇する傾向は強まっています。
3.SSLの仕組み
SSLと聞くと暗号化してセキュリティを高めるものというように漠然と捉えている人が多いのではないかと思います。だからSSL化が大事だと言われてもどのように重要で、どのようにセキュリティを高めるものなのかはっきりと分からないからSSL化の対応が遅れているものと予想します。ではSSLはどのような仕組みになっているのでしょうか?
まずSSLが暗号化する対象が一対一での機器の間でやり取りされているデータです。
このデータには例えばパスワード、アカウント、カード番号や住所などの個人情報、HTTPメッセージのボディ(内容)のみが暗号化の対象となります、逆にボディ以外の部分(誰に送信するかといった宛先)は暗号化の対象にはなりません。
次に仕組みについてですが、SSLにおいて出てくる登場人物が①クライアント、②Webサーバ、③SSLサーバ証明書、④共通鍵、⑤秘密鍵の5つです。
HttpsサイトにアクセスするとWebサーバからサーバ自身の身元を証明するサーバ証明書がクライアントへ送られます。因みにこの証明書にはサーバの署名が付与されているのでクライアントは認証局に登録されている公開鍵でサーバ証明書の署名が本当にアクセス先のWebサーバのものなのかを確認します。
ここまでがお互いの存在を確認しあう流れです。お互いの身元が確認できたら次に行うことはデータを送ることです。
データを送る時の事前準備としてサーバ側からサーバの共通鍵を受け取っておきます。
データを送る際にクライアントがすることは2つ、1つ目がサーバ側で共通鍵を作成するための材料となるデータを生成し、そのデータを事前にサーバから受け取った公開鍵で暗号化します。
2つ目が先ほど生成した共通鍵作成の材料となるデータから共通鍵を作成して、この鍵で送りたいデータを暗号化します。
最初にクライアントから送付するものは共通鍵作成材料となるデータを送ります。これを先に行うことでサーバ側では秘密鍵で暗号化された共通鍵作成材料を解錠してそこから共通鍵を作成します。
そしてその後で暗号化された個人情報等が入ったデータが送られてくるのでそれをサーバの秘密鍵で解錠して読めるようにします。そしてサーバからクライアントへデータを送るときも先ほどサーバで作成した共通鍵を使って同じ手順でデータのやり取りを繰り返します。
仕組みとしては上記のような感じですがここで気づくことはネット上に流れるのは暗号化されたデータと共通鍵作成用の材料のみです。
共通鍵など鍵自体が一切流れることがありません。次に毎回データのやり取りをするときに同じ共通鍵を使っていないということです。
SSL化が比較的安全と言われるのは暗号化をするときに使われる鍵の管理が徹底して守られるように作られていることです。
4.SSL化の手順
SSL化へと行うための手順を紹介していこうと思いますが、手順を細かくここでは説明は致しません。
なぜならSSL化はLPIC303(最近だとLinuC303)の必須範囲で、2018年現在だと303の唯一のテキストであるインプレス社の「改訂新版LPIC Level3 303 Version2.0対応教科書+問題集」、通称黒本に手順が書いています。
サーバ証明書作成は黒本のp.32〜p.33、クライアント証明書作成は黒本のp.35〜p.36、SSLの設定方法は黒本のp.43〜p.57に掲載されています。ただし初めてSSL化をしていくとCSRを使ってサーバ証明書を作成するときに以下のようなエラーが出てくる可能性があります。
/etc/pki/CA/index.txt: No such file or directory unable to open '/etc/pki/CA/index.txt' 139883256969032:error:02001002:system library:fopen:No such file or directory:bss_file.c:355:fopen('/etc/pki/CA/index.txt','r') 139883256969032:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:357:
これは/etc/pki/CA/ディレクトリ下にindex.txtがないと言っているので、以下のコマンドでindex.txt 空ファイルを作成します。
touch /etc/pki/CA/index.txt
次に証明書を作成する際にopenssl caのオプションで-create_serialを使うので以下のコマンドでCA およびすべての後続の証明書をラベル付けするシリアルファイルを作成します。
echo ‘1000’ > /etc/pki/CA/serial
上記の場合だと鍵の作成者の身元等の情報の連番が1000から始まり、後続の証明書を作成したときに連番付きでindex.txtに履歴として追記されます。
SSL化の手順でopensslでどのようなコマンドを打っていったらよいのかは割愛させていただきます。
なぜならSSL化の手順はインターネットで調べると作者ごとにやり方が多少異なるのが見受けられたからです。
方法がいくつかあるのはいいことかと思いますが、個人的にはいきなりブログに頼るのは良くないと思います。
個々のブログは情報が断片的になりがちなので、まずはLPIC303の黒本で体系立てて知識を学んだ方がいいですし、黒本どおりの手順で進めていくとSSLの設定をすることができました。
5.SSLで使われる暗号アルゴリズム
SSLで使われている暗号アルゴリズムはopenssl ciphersコマンドで確認ができます。
例えばopenssl ciphers -vとコマンドを打ってみると以下のような結果が表示されます。
<code>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 ECDHE-RSA-AES256-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA1 ECDHE-ECDSA-AES256-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA1 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 DHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1 DHE-DSS-AES256-SHA SSLv3 Kx=DH Au=DSS Enc=AES(256) Mac=SHA1 GOST2012256-GOST89-GOST89 SSLv3 Kx=GOST Au=GOST01 Enc=GOST-28178-89-CNT Mac=GOST89IMIT DHE-RSA-CAMELLIA256-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=Camellia(256) Mac=SHA256 DHE-DSS-CAMELLIA256-SHA256 TLSv1.2 Kx=DH Au=DSS Enc=Camellia(256) Mac=SHA256 DHE-RSA-CAMELLIA256-SHA SSLv3 Kx=DH Au=RSA Enc=Camellia(256) Mac=SHA1 DHE-DSS-CAMELLIA256-SHA SSLv3 Kx=DH Au=DSS Enc=Camellia(256) Mac=SHA1 GOST2001-GOST89-GOST89 SSLv3 Kx=GOST Au=GOST01 Enc=GOST-28178-89-CNT Mac=GOST89IMIT 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 ECDH-RSA-AES256-SHA SSLv3 Kx=ECDH/RSA Au=ECDH Enc=AES(256) Mac=SHA1 ECDH-ECDSA-AES256-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=AES(256) Mac=SHA1 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 AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1 CAMELLIA256-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=Camellia(256) Mac=SHA256 CAMELLIA256-SHA SSLv3 Kx=RSA Au=RSA Enc=Camellia(256) Mac=SHA1 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 ECDHE-RSA-AES128-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA1 ECDHE-ECDSA-AES128-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA1 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 DHE-RSA-AES128-SHA SSLv3 Kx=DH Au=RSA Enc=AES(128) Mac=SHA1 DHE-DSS-AES128-SHA SSLv3 Kx=DH Au=DSS Enc=AES(128) Mac=SHA1 DHE-RSA-CAMELLIA128-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=Camellia(128) Mac=SHA256 DHE-DSS-CAMELLIA128-SHA256 TLSv1.2 Kx=DH Au=DSS Enc=Camellia(128) Mac=SHA256 DHE-RSA-CAMELLIA128-SHA SSLv3 Kx=DH Au=RSA Enc=Camellia(128) Mac=SHA1 DHE-DSS-CAMELLIA128-SHA SSLv3 Kx=DH Au=DSS Enc=Camellia(128) Mac=SHA1 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 ECDH-RSA-AES128-SHA SSLv3 Kx=ECDH/RSA Au=ECDH Enc=AES(128) Mac=SHA1 ECDH-ECDSA-AES128-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=AES(128) Mac=SHA1 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 AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1 CAMELLIA128-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=Camellia(128) Mac=SHA256 CAMELLIA128-SHA SSLv3 Kx=RSA Au=RSA Enc=Camellia(128) Mac=SHA1 ECDHE-RSA-RC4-SHA SSLv3 Kx=ECDH Au=RSA Enc=RC4(128) Mac=SHA1 ECDHE-ECDSA-RC4-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=RC4(128) Mac=SHA1 ECDH-RSA-RC4-SHA SSLv3 Kx=ECDH/RSA Au=ECDH Enc=RC4(128) Mac=SHA1 ECDH-ECDSA-RC4-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=RC4(128) Mac=SHA1 RC4-SHA SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=SHA1 RC4-MD5 SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=MD5 ECDHE-RSA-DES-CBC3-SHA SSLv3 Kx=ECDH Au=RSA Enc=3DES(168) Mac=SHA1 ECDHE-ECDSA-DES-CBC3-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=3DES(168) Mac=SHA1 EDH-RSA-DES-CBC3-SHA SSLv3 Kx=DH Au=RSA Enc=3DES(168) Mac=SHA1 EDH-DSS-DES-CBC3-SHA SSLv3 Kx=DH Au=DSS Enc=3DES(168) Mac=SHA1 ECDH-RSA-DES-CBC3-SHA SSLv3 Kx=ECDH/RSA Au=ECDH Enc=3DES(168) Mac=SHA1 ECDH-ECDSA-DES-CBC3-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=3DES(168) Mac=SHA1 DES-CBC3-SHA SSLv3 Kx=RSA Au=RSA Enc=3DES(168) Mac=SHA1 EDH-RSA-DES-CBC-SHA SSLv3 Kx=DH Au=RSA Enc=DES(56) Mac=SHA1 EDH-DSS-DES-CBC-SHA SSLv3 Kx=DH Au=DSS Enc=DES(56) Mac=SHA1 DES-CBC-SHA SSLv3 Kx=RSA Au=RSA Enc=DES(56) Mac=SHA1</code>
パッと見ただけでは何のことか分からないと思います。
上記のから一例で1つ取り上げます。
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD
1列目のECDHE-RSA-AES256-GCM-SHA384は暗号スイート名を表しています。
因みに暗号スイートとは簡単にいうと暗号を組み合わせて1つにまとめたもののことを言います。
上記の例で言えばECDH、RSA、AESGCM(256) 、AEADの4つの暗号アルゴリズムを
ECDHE-RSA-AES256-GCM-SHA384という名前を与えてまとめています。
2列目のTLSv1.2はSSL/TLSバージョンを表しています。
3列目以降ですがそれぞれの暗号アルゴリズムの役割を表しています。Kx=ECDHのKxは鍵交換を示していて、鍵交換の時にはECDHというアルゴリズムを使って、4列目のAuは証明書の署名を表し、これに対してはRSAというアルゴリズムが使われています。
このように状況と過程に応じて暗号アルゴリズムを使い分けています。
そして見てみると状況に応じてよく使われているアルゴリズムがほぼ決まっているように見えます。
例えば鍵交換の時はプロトコルのバージョンに関係なくECDH、DHアルゴリズムが一番使われています。
DHとECDHは系統としては同じアルゴリズムになります。
DHとはDiffie-HellmanというDiffieとHellmanという人物が作った鍵共有のアルゴリズムのことです。
このアルゴリズムの利点は安全でないネットワーク上でも秘密鍵を第3者に知られることなく指定の相手と鍵を共有できることです。
仕組みとしては簡単で自身の決まった情報を渡して相手が本人かどうか確認するのではなく、その時だけに必要な一時的な秘密情報を作ってそれをもって当人同士を確認し合うというものです。鍵を共有する時、安全性が高いアルゴリズムです。
そしてDHをさらに進化させたのがECDHで、ECは楕円曲線のことです。
ECDHが行なっていることはDHと同じようなことですが、量子コンピュータがないと解けないレベルのアルゴリズムなので鍵共有におけるセキュリティとしては現在のところ世界一だと思います。
他にも証明書の署名でよく使われるのはRSAという5種類の数学知識をふんだんに使った公開鍵暗号であったり、通信を暗号化するのにDESというアメリカの国家安全保障局が普段から使っているアルゴリズムが使われていたりします。
いずれにせよ暗号化の技術は数学の知識が数多く使われていますが、個人情報が奪われてもどうすれば解読されずに済むのかを
追求していった結果、専門性の高い分野に押し上げられていきました。
ですのでIT関連の分野に携わっていてもそれほど深く馴染みがない謎な分野でもあります。
6.SSL化していれば安全?
SSL化しているからあとは何もしなくても大丈夫という考えに陥ってしまう方が中にはいるかとは思いますが、SSLはあくまでセキュリティを高めるための手段の1つでありそれが全てではないです。
それでもSSLを導入すると暗号化してのやり取りになり、手順が増えることで通常より通信速度が遅くなりますが、現在攻撃方法としては厄介な中間者攻撃に対しても有効なので安全性はかなり高いといった印象です。
ただしいつSSLの脆弱性が見つかるか分からないので、セキュリティに関する情報はこまめに仕入れておき、自分の身をしっかりと守るためにSSLを導入したとしてもガードを下げないようにしておくことが最も有効なセキュリティ対策ではないかと思います。
7.まとめ
自社研修をきっかけにSSLについてより深く知る必要が出てきましたので今回はこのテーマについてお話しました。
SSLは相手の顔や印象が分からないインターネット上でやり取りするために自分は怪しいものではないことを証明するための安全な手段だと言えます。機械学習など最新の技術をセキュリティ面に活かす動きも出てきていますが、それでもセキュリティ事故は減らすことはできてもなくなることはないと思います、なぜならセキュリティ事故で最も多い原因が人為的に起こされたことだからです。
人の気の緩みをどうにか解決するのは今のところ人工知能など最新の技術でもまだ不可能なので、これは時代が変われどセキュリティ事故を防ぐための手段は変わることはないと思います。
Avintonは仲間を募集しています!
Avintonはエンジニアを積極採用しています。
文理・経験問わず、これまで様々なバックグラウンドを持った社員を採用してきました。
現在いい勢いで成長しているAvinton。社員の数もどんどん増加しています。毎月行っている採用イベント、Meetupもぜひチェックしてください!
ご連絡お待ちしています!!