
go embedでバイナリにシークレットを埋め込んでいいの?
Go1.16 リリース 👏🏻
Go 1.16 が リリースされましたね。
このバージョンから embed package が追加されて バイナリにファイルを埋め込むことができるようになりました。
シークレット情報埋め込んでもいいのかな?
go1.16でファイルをバイナリに含められるようになったけど、シークレットとかenvとかいれてもいいのかな
— てつ (@tetsuzawa_el) February 18, 2021
ふっと思いました。
環境によってビルド方法を変えてバイナリにシークレット情報を埋め込んじゃえば運用が楽になるんじゃないかな?と。
AWS の SSM にシークレットを用意したりしなくていいし。
実験してみました。
「シンプルなコードをコンパイルして、埋め込みありとなしで比較すればシークレットの中身が解析できそうかわかるかも」との予測のもと、実験してみました。
コード
埋め込みなしのコード 👇。
package main
import _ "embed"
var s string
func main() {
print(s)
}
埋め込みありのコード 👇。
package main
import _ "embed"
//go:embed hello.txt
var s string
func main() {
print(s)
}
埋め込んだファイル(hello.txt)👇。 サイズは 35bytes です。
hello credentials xxxxxxxxxxxxxxxxx
コンパイル後のバイナリサイズ比較
サイズは同じになりました。(どゆこと???)
埋め込みなし | 埋め込みあり | |
---|---|---|
サイズ [byte] | 1,287,680 | 1,287,680 |
Hex Editor で中身を見てみた
よくわからなかったので Hex Editorでバイナリの中身を見てみました。
バイナリの中身をのぞいていると、あっけなく hello.txt の中身が発見できちゃいました。

結論: 自身を持ってだめとは言えない
上の結果からわかるように、簡単に中身が解析できてしまうので、バイナリが配布するようなプロジェクトでは使えないでしょう。
ただ、非公開サーバーで動くプログラムならあながちありなのかなと思いました。シークレットファイルを別途管理する必要がなくなりますし、シングルバイナリの恩恵を享受しやすくなるのかなと思います。
考察あまりしてません。マサカリお待ちしてます。