2023 年の振り返り
はじめに
2023 年の振り返りです。
お仕事とか
インプット
2022 年の振り返りでも書いたのですが、友人と O'Reilly の課題図書を決めて読む取り組みは継続して行うことができました。去年と比べて一緒に本を読んでくれる人が増えたのも嬉しいことです。今年はこんな本を読みました。
アウトプット
去年は自分のブログによるアウトプットが主でしたが、今年は外部での登壇や各種メディア記事への寄稿も実施しました。こういう機会を持ってきてくれる縁に感謝です。
- ブログ(Qiita): 11 記事
- メディア記事: 2 記事
- CloudNative Days Tokyo 2023
まだ諸事情で公開できないのですが、この他にいくつか他メディアで公開予定の記事も控えていたりします。
プライベート
あまり公には言っていなかったのですが、10/24 に入籍をしていました!これが今年一番の報告事項です。
2022 年の振り返り
はじめに
2022 年の振り返り&ちょっとした新年の抱負です。
お仕事、etc.
インプット
丁度今年の 3 月でしょうか?友人と O'REILLY の課題図書を決めて毎週木曜日の夜に輪読会を始めました。1 章を 1 週間でそれなりにきちんと読んでいくので毎回時間はかかりますが、確実に身になっている気がするので良い取り組みだと思っています。今年は、読みかけのものも含まれていますが、こんな本を読みました。
取り組みに Join したい方は是非私に声をかけてください!
アウトプット
アウトプットは例年とあまり変わらずで、ブログによるアウトプットが主なものでした。一応、こんな記事を書いています。
- OCI Vision と Data Labeling でサクッと画像分類
- Chaos Mesh と Grafana の連携手順
- Spark Oracle Datasource を使って OCI Data Flow から Oracle Database に簡単にアクセスしよう
- Oracle Functions の新機能 - Provisioned Concurrency について
- OCI DevOps を使った Java アプリケーションのビルドを高速化する
- Micronaut on Oracle Functions ことはじめ
- OCI Search Service with OpenSearch を使うための最低限の環境を IaC 化した
- Micronaut を使って ATP と連携する Function を簡単に実装する
はてなブログで、SPIFFE の仕様を全部読んでいくシリーズをやろうと思いましたが、道半ば挫折しました。中途半端な状態で残っているので、2023 年に残りのコンテンツをやらなければ...
また、ありがたいことに外部のイベントにスピーカーとして呼んでいただけることもありました。
コミュニティ活動
今年は、新しくコミュニティ活動も始めて、CloudNative Days 実行委員の Observability チームに Join しています。来年は面白そうなイベントも企画されているので、もっと積極的に関わっていければな、と思っています。
プライベート
麻雀以外のゲームをほとんどやらない僕ですが、今年は GW 明け頃からマリオカート 8dx にドはまりしていました。是非、皆さん一緒にやりましょう。
SPIFFE 仕様全部読んでく - JWT-SVID
SPIFFE に個人的に興味を持ち始めたので、https://github.com/spiffe/spiffe/blob/main/standards/ にある仕様を全部読んで簡単にまとめてく。今回は、JWT-SVID についてです。 尚、学習中であるため解釈が間違っている可能性は存分にあります。
ざっくりまとめ
原文: JWT-SVID
Schema は、ここを見るとよい: https://github.com/spiffe/spiffe/blob/main/standards/JWT-SVID.schema
Introduction
- JWT-SVID
- トークンベースの SVID で L7 の境界を越えて、アイデンティティの主張をするために使われる
- 標準的な JWT にいくつか制限を加えたもの
- JWS Compact Serialization を必ず使用する
JOSE Header
以下に記載のないヘッダーはいかなる場合も JWT-SVID JOSE Header に含めてはいけない。
- MUST
- alg(Algorithm)
- 以下、参照
- alg(Algorithm)
- OPTIONAL
- kid(Key ID)
- typ(Type)
JWTorJOSE
alg でサポートされているアルゴリズムは以下の通り
alg Param Value |
Digital Signature Algorithm |
|---|---|
| RS256 | RSASSA-PKCS1-v1_5 using SHA-256 |
| RS384 | RSASSA-PKCS1-v1_5 using SHA-384 |
| RS512 | RSASSA-PKCS1-v1_5 using SHA-512 |
| ES256 | ECDSA using P-256 and SHA-256 |
| ES384 | ECDSA using P-384 and SHA-384 |
| ES512 | ECDSA using P-521 and SHA-512 |
| PS256 | RSASSA-PSS using SHA-256 and MGF1 with SHA-256 |
| PS384 | RSASSA-PSS using SHA-384 and MGF1 with SHA-384 |
| PS512 | RSASSA-PSS using SHA-512 and MGF1 with SHA-512 |
JWT Claims
RFC 7519 で定義された claim にいくつか制限を加えている(新しい claim は追加されていない)
- 実装のために、新しい claim を追加しても良いが、相互運用性に影響を与える可能性には考慮する
MUST
- sub(Subject)
- aud(Audience)
- exp(Expiration Time)
Token Signing and Validation
- JWT-SVID の署名、検証の手順は通常の JWT/JWS と同様なので割愛
Token Transmission
- Serialize は、JWS Compact Serialization を必ず使用すること
- HTTP でトークンを送信する場合には、
Bearerスキームを使用し、Authorizationヘッダーで送信するべき - gRPC でトークンを送信する場合には、メタデータキー
authorizationにBearer <serialized_token>を設定するべき
Representation in the SPIFFE Bundle
- JWT-SVID の署名鍵は、JWK として表現される
- MUST
- use
jwt-svid
- kid
- use
Security Considerations
SPIFFE 仕様全部読んでく - SPIFFE ID
SPIFFE に個人的に興味を持ち始めたので、https://github.com/spiffe/spiffe/blob/main/standards/ にある仕様を全部読んで簡単にまとめてく。今回は、SPIFFE-ID についてです。 尚、学習中であるため解釈が間違っている可能性は存分にあります。
ざっくりまとめ
原文: https://github.com/spiffe/spiffe/blob/main/standards/SPIFFE-ID.md
SPIFFE ID
trust-domain
- SPIFFE を実行する個人、組織、環境、部門等を示す
- ※パブリック DNS のようにどこか公な場に登録するようなものではない
- trust-domain 名の制限
- trust-domain は自由に選択することができるが、規約や登録を行うための中央集権的な機関は存在しない
- i.e. グローバルに一意であることは全く保証できない
- 偶発的な衝突を避けるために、グローバルユニークな可能性が高いものを trust-domain として選択することが推奨されている(DNS 名など)
- trust-domain 名を自動生成する場合は、グローバルに衝突しにくいような UUID 等を用いることが強く推奨されている
- 衝突が発生した場合は、独立して動作し続けることが可能だが、フェデレート(相互接続)は行うことができない
path
- path の制限
- パスの例
Maximum SPIFFE ID Length
- RFC 3986 で定義されているように、URI には長さの制限がない
- SPIFFE では、相互運用性を考慮しこの長さを 2048 バイトまでに制限している
- ただし、推奨最大長なので一応これを超過することも可能
- trust-domain の最大長は 255 バイト
- これは、RFC 3986 の host 部の最大長で定義がされている
SPIFFE ID Parsing
- RFC 3986 に従ってパースされる
- スキーム(
spiffe)と trust-domain は大文字と小文字を区別しないが、パスは区別される
- スキーム(
SVID(SPIFFE Verifiable Identity Document)
- SVID
- ワークロードが SPIFFE ID を呼びだし元/先と通信する仕組み
- trust-domain 内の CA によって署名された場合、その ID を有効とみなす
SVID Trust
- 署名機関は、trust-domain 内に存在しなければならず、自身の SVID を有さなければならない
SVID Components
- 3 つの要素から構成される
- SPIFFE ID
- 有効な署名
- (オプション)公開鍵
- SPIFFE ID と(オプション)公開鍵は、署名される Payload の一部に含めなければならない
- SVID 内には上記の情報以外を含めてもよい
- JWT-SVID とかはその典型例
SVID Format
- (2022/07 現在)サポートされているドキュメントタイプ
- X.509
- JWT
- 詳細は、別記事で
Security Considerations
SVID Assertions
Temporal Accuracy
- SVID は、鍵の漏洩とそれに伴う損害を軽減することを目的として、限られた時間だけ有効なものとなっている
- どのような情報を含めるか?を検討する際は上記のようなことを考慮することが重要
Scope and Influence
- SVID は、それが存在する trust-domain 内の署名機関によって署名される
- i.e. SVID の情報全てを検証するのは、署名機関の責任
- アサーションの有効範囲は、trust-domain に閉じるべき
- e.g. ある trust-domain A で "admin" というロールを持つエンティティを他の trust-domain B で "admin" として扱うべきではない、etc.
Interpretation
- 柔軟性を持たせるために SVID 仕様は、任意の情報を含めることを許可している
- 任意の情報を含めたとしても原則は、意味が合意された trust-domain に限定するべき
Veracity
SPIFFE 仕様全部読んでく - 全体概要
SPIFFE に個人的に興味を持ち始めたので、https://github.com/spiffe/spiffe/blob/main/standards/ にある仕様を全部読んで簡単にまとめてく。 尚、学習中であるため解釈が間違っている可能性は存分にあります。
ざっくりまとめた各仕様のリンク先
TODO
ざっくりまとめ
原文: https://github.com/spiffe/spiffe/blob/main/standards/SPIFFE.md
- SPIFFE を構築する 3 つの主要コンポーネント
SPIFFE ID
- ワークロードを識別するための ID の形式を規定している
SVID(SPIFFE Verifiable Identity Document)
- SPIFFE ID 搭載した検証可能なドキュメントのこと
- X.509 or (JWS 形式の)JWT で表現される
- X.509-SVID
- JWT-SVID
- 各詳細は、別のまとめを参照
Workload API
Kubernetes 認定資格(CKA)でよく使いそうなコマンド等のメモ
はじめに
2021 年の年末から Kubernetes 認定資格(CKA)のお勉強を本格的に開始しました。この記事は、資格対策講座で勉強しながら”これ試験でも使いそう...!!”と思ったものを自分のためにメモしていくものです。(※随時追記します)
alias etc.
試験が始まったら、まずこれ。他にもありそうだけど、個人的には一旦これで十分な気がしている。
bash シェルにコマンド補完を設定する。
source <(kubectl completion bash) echo "source <(kubectl completion bash)" >> ~/.bashrc
エイリアスを設定する。
alias k=kubectl complete -F __start_kubectl k
ちなみに、Kubernetes の公式ドキュメントのチートシートに記載があるので、試験本番中も閲覧可能。
--dry-run=client -o yaml は、めちゃ使うので、環境変数とかで設定しておくと良さそう。
export do="--dry-run=client -o yaml" # この辺はお好みで... export oj="-o json" export oy="-o yaml" export ow="-o wide"
ついでに、.vimrc に以下の設定をしておく。
set tabstop=2 set expandtab set shiftwidth=2 set autoindent set number set ignorecase
コマンド
とにかく時間が足りないらしいので、極力 Manifest を手書きで書くことは避ける。
Pod の作成
そのまま、作成する場合
k run <pod-name> --image=<image-name>
一旦、YAML 形式で出力してから手直しする場合(securityContext や toleration など kubectl のオプションに含まれていない設定を行う場合)
k run <pod-name> --image=<image-name> --dry-run=client -o yaml > <file-name>
リソースの作成
ここで指しているリソースは以下の通り。特に、clusterrole, clusterrolebinding, deployment, namespace, role, rolebinding, secret, service, serviceaccount 辺りはよく使うのでヘルプしなくてもある程度は使えるようになっておいた方がいい。
- clusterrole
- clusterrolebinding
- configmap
- cronjob
- deployment
- ingress
- job
- namespace
- poddisruptionbudget
- priorityclass
- quota
- role
- rolebinding
- secret
- service
- serviceaccount
そのまま作成する場合
k create <resource-name> ...
一旦、YAML 形式で出力してから手直しする場合
k create <resource-name> --dry-run=client -o yaml > <file-name>
この Pod どの Node に配置されてる?
-o wide で OK
k get po -o wide
ラベル付きで Pod の一覧を出力したい
Network Policy の設定等の際に、ラベル付きで一覧表示したいときに使う。
--show-labels でOK
k get po --show-labels
ここの Manifest どう書くんだっけ...?
ドキュメントに記載の Manifest を参照するか、 一部分だけ分からないなら explain で調べる。
k explain po.spec
ブックマーク
CKA では試験中にドキュメントを参照できます。一応サイト内に検索機能はあるのですが、本番中に許可されていないサイトへのリンクも含まれているためちょっとリスキーです。そのため、基本は自分のブックマークから飛ぶと良いでしょう。(と言いつつ、私は普通にサイト内検索しまくりましたが...)一応、当日はこんな感じのブックマークを作成していました。ほとんど使わなかったけど... ご参考までに。
- kubernetes_ja - top
- kubectlチートシート | Kubernetes
- Kubectl Reference Docs
- kubeadmを使用した高可用性クラスターの作成 | Kubernetes
- 永続ボリューム | Kubernetes
- DaemonSet | Kubernetes
- Node Affinityを利用してPodをノードに割り当てる | Kubernetes
- Upgrading kubeadm clusters | Kubernetes
- Operating etcd clusters for Kubernetes | Kubernetes
- Configure a Security Context for a Pod or Container | Kubernetes
- Certificate Signing Requests | Kubernetes
- Configure Service Accounts for Pods | Kubernetes
- コンテナの環境変数の定義 | Kubernetes
- ネットワークポリシー | Kubernetes