秋口の銀河庭園

go embedでバイナリにシークレットを埋め込んでいいの?

Go1.16 リリース 👏🏻

Go 1.16 が リリースされましたね。

このバージョンから embed package が追加されて バイナリにファイルを埋め込むことができるようになりました。


シークレット情報埋め込んでもいいのかな?

ふっと思いました。

環境によってビルド方法を変えてバイナリにシークレット情報を埋め込んじゃえば運用が楽になるんじゃないかな?と。

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,6801,287,680

Hex Editor で中身を見てみた

よくわからなかったので Hex Editorでバイナリの中身を見てみました。

バイナリの中身をのぞいていると、あっけなく hello.txt の中身が発見できちゃいました。

hello.txtの中身が見えている

結論: 自身を持ってだめとは言えない

上の結果からわかるように、簡単に中身が解析できてしまうので、バイナリが配布するようなプロジェクトでは使えないでしょう。

ただ、非公開サーバーで動くプログラムならあながちありなのかなと思いました。シークレットファイルを別途管理する必要がなくなりますし、シングルバイナリの恩恵を享受しやすくなるのかなと思います。


考察あまりしてません。マサカリお待ちしてます。

Takizawa Tetsu
Takizawa Tetsu

音のVRの研究をしながらWebの技術を勉強しています。