けけずんセルフハッキング

エンジニアっぽい雰囲気を醸しだしているかのようなブログです!

GitLab CI VariablesにFileとして保存したPEM形式の鍵を展開する際にハマった

概要

GitLab CIでVariablesに保存したPEM形式の鍵を展開し、プログラムの中でその鍵を読み込んで使用しようとしたが上手く動かなかった。

そのときの原因と解決方法について書く。

やりたいこと

以下のPEM形式(説明しやすいように内容はてきとうです)の鍵があるとする。

-----BEGIN RSA PRIVATE KEY-----
1行目です〜
2行目です〜
3行目です〜
4行目です〜
-----END RSA PRIVATE KEY-----

こいつをGitLab CI Variablesに登録して、GitLab CI上でファイルとして展開し、プログラムの中で使用したい。

問題発生までの手順

GitLab CI Variablesに鍵の内容を保存する

GitLab CI Variablesを開き、以下の内容を入力していく。

  • Type: 「File」を選択する
  • Key: 「YOUR_PRIVATE_KEY」と入力する
  • Value: 上記の鍵をコピペする

画面的にはこんな感じ。

f:id:kkznch:20190728221255p:plain

GitLab CI用の設定ファイルを書く

以下の内容で .gitlab-ci.yml を作成する。

内容としては、GitLab CI Variablesに登録した環境変数を一度 .gitlab-ci.yml のvariablesで受け取ってそれをファイルとして書き出しているだけ。

stages:
  - test

set_privatekey:
  stage: test
  image: alpine:latest
  variables:
    PRIVATE_KEY: YOUR_PRIVATE_KEY
  script:
    - echo ${PRIVATE_KEY} > private.key

この状態でcommit & pushする。

プログラム中で使用...できない

上記と同様のことを実際のプロジェクトで行いデプロイまでしたのだが、デプロイ後にプログラムを動かしても動く気配なし。

ログを見ると、鍵の形式が不適切なため読み込めないとのこと。どういうこったい。

原因

ということで原因を特定するために .gitlab-ci.yml を以下のようにしてみた。

stages:
  - test

set_privatekey:
  stage: test
  image: alpine:latest
  variables:
    PRIVATE_KEY: YOUR_PRIVATE_KEY
  script:
    - echo ${PRIVATE_KEY} > private.key
    - cat private.key

そのときの出力結果がこちら。

$ echo ${PRIVATE_KEY} > private.key
$ cat private.key
-----BEGIN RSA PRIVATE KEY----- 1行目です〜 2行目です〜 3行目です〜 4行目です〜 -----END RSA PRIVATE KEY-----

ふぁ!?なぜにワンライナーで表示されるし??

改行まで含めてPEM形式のため、しっかりと改行されてる状態じゃないと読み込んでくれないらしく、こいつが原因だった模様。

こちら参考ページ。

解決

二通りの解決方法がありけり。

その1

.gitlab-ci.yml を以下のようにする。

stages:
  - test

set_privatekey:
  stage: test
  image: alpine:latest
  variables:
    PRIVATE_KEY: YOUR_PRIVATE_KEY
  script:
    - echo "${PRIVATE_KEY}" > private.key

何が違うかって?

    - echo "${PRIVATE_KEY}" > private.key

この echo で渡す引数をダブルクォーテーションで括ってる。 これで意図したようにファイルに展開される。

その2

.gitlab-ci.yml を以下のようにする。

stages:
  - test

set_privatekey:
  stage: test
  image: alpine:latest
  script:
    - cat ${YOUR_PRIVATE_KEY} > private.key

GitLab CI Variablesに登録した環境変数をそのまま cat してあげてる。

ここで echo を使ってない理由は、GitLab CI VariablesにFileとして登録した環境変数には値がそのまま入っているわけではないから。 もし echo で実行すると、以下のように登録した値が格納されたファイルへのパスが出力される。

/builds/{ユーザID}/test-variables.tmp/YOUR_PRIVATE_KEY

なるほど、 cat だと上記のパスにあるファイルの中身を出力してる感じになってるらしい。

おわりに

公式サイトにFileな値を出力する方法が載ってたので、まずはそれを見るべきだった気もする。

個人的に気になってるのが、GitLab CI Variablesで登録した値を使用する際は .gitlab-ci.yml のvariablesを経由して使用する必要があるのか?といったところ。 いちいちGitLab CI Variablesのページにいかなくても、CI上で必要な環境変数を一覧できるという意味では割と有効かもしれんが、実際のところどうなのかは分からない。