sigstoreのKeyless Signingでは何を検証しているのか
最近、個人的にsigstoreのKeyless Signingがアツいです。以下のブログを読みました。
これらの記事は主にコンテナイメージの署名について解説しているのですが、sigstoreはバイナリの署名にも使えます。以前から、複数メンテナ体制で秘密鍵をどう共有しよう?とか、公開鍵の安全な配布方法って無くない?と考えていたので、渡りに船です。
チームでひとつの鍵を保守したい場合とかどうやってるんだろ、みんなに主キー配るんかな、まぁそりゃそうか...
— wata (@wata727_) 2021年5月1日
リリースバイナリの署名に使った鍵をキーサーバーで公開してたら、今それ信用できんのでリポジトリに公開鍵入れてくれという話が来ていた、もう何も信用できないhttps://t.co/2g5diZxGIM
— wata (@wata727_) 2019年12月24日
早速、採用に向けて色々調べていたのですが、署名した人をどう確認しているのか、改ざんされていないことをどう保証しているのかがわからなかったので、Keyless Signingでは何を検証する必要があるのかを調べました。
全然わからない状態から調べているので、間違ったことを書いてるかもしれません。何か間違いを見つけたらTwitterとかで教えて下さい。
続きを読むコンテナはなぜ安全(または安全でない)なのか
CVE-2019-5736を覚えていますか?今年の2月に見つかったrunc(Dockerがデフォルトで利用しているコンテナのランタイム)の脆弱性で、ホストのruncバイナリを好き勝手にコンテナ内部から書き換えることができるというものです。
脆弱性の仕組みに興味があったので調べたところ、コンテナを攻撃する方法というのは他にもいろいろあって、runcは頑張ってそれを塞いでいるようです。これまとめると面白いかも、と思ったので以下のようなおもちゃを作りました。
Drofuneは簡単なコンテナランタイムです。drofune run
とかdrofune exec
などでコンテナを起動したり、入ったりすることができます、といえば想像がつくでしょうか。
これだけでは何も面白くないので、Drofuneはわざと安全でない実装になっています。なので、今回発見されたCVE-2019-5736を利用した攻撃も成立します。このプロジェクトは攻撃コードがどのように動き、どのように防げるのかを試すことが目的です。
続きを読むRubyのprivateを考える
RuboCopのIssueを眺めていると、いろいろな人のRubyの考え方に触れることができて面白い。例えば、多くのRubyistにとってprivateなメソッドを宣言したいときには、以下のような書き方をすると思う。
class Cat def meow puts "Meow!" end private def bowwow puts "Bowwow!" end def cock_a_doodle_doo puts "cock-a-doodle-doo" end end
private
の後にインデントするとかしないとか、微妙な差異こそあれど、大体こんな感じ。でも、これをよくないと考える人もいる。ではどうするのかというと、以下のようにインラインでアクセス修飾子を書くべきだという主張。
class Cat def meow puts "Meow!" end private def bowwow puts "Bowwow!" end private def cock_a_doodle_doo puts "cock-a-doodle-doo" end end
以下はこのスタイルを強制することができるCopを追加するプルリクエスト。RuboCop v0.57.0 以上を使っているならば、EnforcedStyle
をinline
にすれば、すぐに試すことができる(ただ、v0.57.2 時点でいくつかの問題が報告されているので、有効にして運用するのはちょっとオススメしない...)
RuboCopの Rails/InverseOf について調べた
最近、RuboCopへのパッチを投げるようにしているのですが、なんか良さそうなバグは無いかなとissueを漁っていたところ、こんなissueを見つけました。
このissue自体は単なるfalse positiveなので、まぁ対応すれば良いのですが... こっちがその問題のCopが追加されたプルリクエスト。
このCopが教えてくれることは、状況によっては :inverse_of を明示的に指定しないと、意図した挙動をしないことがあるので、その場合にはちゃんと :inverse_of を書きなさいね、ということです。ただ、1個目のissueのコメントで「Railsガイドには :through とか :polymorphic を指定していると、:inverse_of は効かないって書いてあるけど、それでも指定しないとダメなの?」と言っている人もいます。
:inverse_of については、Railsのバージョンアップによってデフォルトで指定しなくても動くようになった経緯などもあって、いつ指定すべきで、いつ指定しなくてもいいのか、いまいち理解が曖昧だったので、ちょっと調べることにしました。
続きを読むRailsアプリをECSにのせてecs-cliでデプロイとかをする
RailsのECS移行事例なんて既に山ほどあるので、特に書くつもりは無かったのですが、実際にやってみると
- 時代が進んで、より便利なものが出てきている
- デプロイどうするのよ、となったときに各自が最強のECSデプロイツールを作っていて、参考にならない
といった体験をしたので、最近やったECS移行の話を書くことにしました。
社内Qiitaに書いたポエムです pic.twitter.com/yDlWGhhkF1
— wata (@wata727_) 2017年8月31日
もちろん、この記事も古くなると何の役にも立たないと思うので、古くなったら、みなさん頑張って調べてください。
続きを読むPHPをもっと良く書くためのLinterを作った
久々にPHPを書きたいなと思い、まず、頭の中の古い常識をクリアするために一通りphp.netを眺めていました。僕のPHPの知識は5.6辺りで止まっているのですが、ヌル合体演算子とか型宣言とか結構便利な感じになってますね。
ヌル合体演算子というのは、簡単に説明すると
<?php // hogehoge $val = isset($array['key']) ? $array['key'] : null; // fugafuga
みたいなおなじみのコードを
<?php // hogehoge $val = $array['key'] ?? null; // fugafuga
みたいに書けるというやつです。便利。
つまり、PHP5.6とかの常識の上で、このように書かれているコードがあれば、レビューで「ヌル合体演算子使うと楽だよー」などと指摘できるのですが、こーいうのはLinterの仕事じゃない??でもPHPにはRuboCop*1みたいな、こーいう便利なことを教えてくれるLinterが無くない??となったので、夏休みを使って作りました。
続きを読む