$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

「プロフェッショナルSSL/TLS」を読んだ

プロフェッショナルSSL/TLS

プロフェッショナルSSL/TLS

  • 作者:Ivan Ristić
  • 発売日: 2018/06/04
  • メディア: 単行本(ソフトカバー)

最近ふとSSL/TLSの仕組みについて知りたくなったので、「プロフェッショナルSSL/TLS」を読んだ。

かなりいろんな話題を網羅していて、かつ具体的な設定例なども書かれていて良かった。TLSに関する仕事をするときや、SSL/TLSHTTPS周りで何回かハマったことがあるなら非常にお勧めできる。

仕組みを理解したいなら1章 SSL/TLSと暗号技術・2章 プロトコル・3章 公開鍵基盤が参考になった。実運用なら8章 デプロイ・9章 パフォーマンス最適化・16章 Nginxの設定あたりが参考になりそう。またTLS周りでハマった時のトラブルシューティングには12章のOpenSSLによるテストが使えるだろう。

ただ最新のTLS 1.3に関してはそこまで多く言及はなかった(電子書籍版の巻末の付録のみ)ので、これについては別書籍や別資料で学ぶ必要があるだろう。

読書メモ

* 暗号は大きくストリーム暗号化方式とブロック暗号化方式の2種類 7
* 安全に通信できる要件(機密性、完全性、真正性)を満たす最小構成 14
    * 共通鍵暗号化によるデータ暗号化で機密性
    * 改竄防止のためのハッシュ鍵によるMAC計算
    * 抜き取ったり送り直したりできないようにメッセージに連番をつけてMACの計算に入れる
    * 会話の最後に特別なメッセージを送り、勝手に中断されないように
    * 公開鍵暗号化方式を使ってお互いを認証し、鍵交換アルゴリズムで共通鍵を交換
* トランスポート層に対する攻撃は大半は中間者攻撃 17
* RSAでの鍵交換をしてしまうと前方秘匿性(PFS)がない。前方秘匿性があるものを利用し、いずれ鍵が漏れても復号できないようにしておくこと 20
* プロトコル 24
    * Recordプロトコルがコンテナ
    * Handshakeプロトコル
        * 大まかに三つ
        * 1. サーバ認証を伴うフルハンドシェイク
        * 2. 前回のセッションを再開する場合の、一部のメッセージを省略したハンドシェイク
        * 3. クライアントとサーバの認証を伴うハンドシェイク
    * Application Dataプロトコル 45
    * Alertプロトコル 45
* 証明書は同じファイル内で複数内容が入っていて良い 30
    * 先頭はサーバ証明書、その後ろに中間証明書が順番に続く。ルート証明書は省くべき
* 接続したいサーバの名前はクライアントでserver_name拡張により指定できる。これにより仮想サーバに安全に接続できる 55
* 証明書とは、公開鍵・公開鍵に紐づけられた主体に関する情報・証明書を発行した主体のディジタル署名の3セット 64
* Name Constraints拡張を使い、例えば自分で所有しているドメイン名に対してのみ証明書を発行できる下位のCAを企業が持てる 66
* インターネットPKIの証明書の仕組みは失効がなかなか難しい 75
    * 遅延が10日間程度(中間CA証明書は12ヶ月)あり得る
    * ソフトフェイルポリシーにより、失効情報の取得エラーの場合、そのまま証明書を使い続ける
* HSTSを使うことで、ユーザー側のミスやページの問題があっても強制的に安全なリソースを取得させられる 137
* CSPを使うことで、安全でないリソースをブロックできる 137
* TLSサーバを安全に運用環境にデプロイするためのアドバイスまとめ 251 ☆
    * こういうタスクがある時は全部読みましょう
* TLSサーバでパフォーマンスを出すために考えること 271 ☆
    * こういうタスクがある時は全部読みましょう
    * TLSに対して特に大きな影響があるのはレイテンシ。ハンドシェイクに時間がかかってしまう
    * TLSにおける鍵交換アルゴリズムのパフォーマンス比較 280
*  HSTSデプロイのためのチェックリスト 301
* パスワード保護された鍵を本番環境で使っても安全性が大きく向上することはない。プログラムのメモリ上では保護されない状態になるため 328
* 証明書の拡張で属性がcriticalになっているものは、証明書を利用する全てのソフトウェアが意味を理解していなければならない 334
* openssl speedを使うと速度検証ができる 350
* プライベートCAの作り方 352 ☆
    * ルートCAを作る
    * 下位CAを作る
    * OCSPなど失効エンドポイントを作る
* Nginxの設定 469 ☆
* 0-RTTはリプレイ攻撃に脆弱である・場合によってPFSがないという問題はあるので、使い方に気をつける必要がある 518

継続的に学習するために効いたやり方3つ

育児していて時間があまり取れない状況下で継続的に学習するために色々な方法を取り入れているんだけど、その中で最近めちゃくちゃ効いた3つのやり方を紹介。

  • やりたいことリストを作っておく
  • 今日のTODOリストを作る
  • 2分間コーディング

やりたいことリストを作っておく

自分が学習したいことの一覧があると、優先度を決めやすくなり、またやりたいことが1つ終わった後すぐに次に取り組むこともできる。そこで僕はTrelloでリストを作り、とにかく少しでもやってみたいと思った開発や、読みたいと思った本などがあれば追加している。

f:id:shiba_yu36:20210504152202p:plain

今日のTODOリストを作る

時間が空いてから「今日はこれから何をやろうかな?」と考えていると、途端にやる気がなくなってダラダラしてしまう。そこで先に今日のTODOリストを作っておくということをやっておく。ポイントとしては

  • 細かい家事やプライベートでやること、勉強すること全て含めて同じリストに入れて、上から順にやっていけばOKという状況にする
  • 全てをやりきれなくても気にせず、かつ次の日に持ち越すということもしない

上のポイントを満たすために、僕はメモアプリのテキストを1つ作り、そこにずっとやることを追記し続けている。

f:id:shiba_yu36:20210504145938p:plain:h400

2分間コーディング

今日のTODOリストを作ったとしても、サボりたい誘惑にかられてしまい、取り組むところまでいけないことも多い。なんとか取り組む手法がないかと思っていたが、最近 2分間コーディングのすすめ、コードを書く習慣のハードルを下げる を見て良さそうと感じたのでやってみた。これが絶大な効果を発揮している。

f:id:shiba_yu36:20210504152416p:plain

2分だけプログラミングすれば良いと思って始めたら大体1時間とかやっていたりするので、人間始めてしまえば長時間続けられるものだなあと感心している。

まとめ

今回は継続的に学習するために自分で工夫したことの中で、特に効いた3つのことについて紹介してみた。この習慣によって、学習だけじゃなくて日々のプライベートでのやること(例えば保育園の書類を出すとか)もどんどん片付くようになったので助かっている。

Next.js + Prisma + NextAuth.js + React Queryを試した

2分コーディングの一環でNext.js + Prisma + NextAuth.js + React Query で作るフルスタックアプリケーションの新時代をやった。とにかく簡単に認証 + DBアクセスがあるアプリケーションを作ってvercelにデプロイできるサンプルが出来て非常に良かった。趣味プロダクトをちょっと作ってみるのに良さそう。

shibayu36/next-prisma-auth-tutorialに試した例を置いているので参考にどうぞ。

やれたこと

  • Googleのアカウントを使ってサインインし、TODOを追加できるアプリケーション
  • herokuのPostgreSQL dbをデータソースとして動くアプリケーションをvercelにデプロイ

作業メモ

利用技術の簡易調査

next-auth

Prisma

const allUsers = await prisma.user.findMany({
    include: { posts: true },
  })

react-query

React Query - Hooks for fetching, caching and updating asynchronous data in React

  • サーバの状態との同期が強い?
  • 基本的には、キャッシュを作ってくれたり、キャッシュの破棄だったり、一定時間で再フェッチしてくれたりみたいなのをいい感じにやれる
  • Quick Start | React Query | TanStack のコードが大体の概念を理解できる
  • Important Defaults | React Query | TanStack あたりを見ると、TTL的なものがデフォルトで入ってて便利

vercel