diff --git a/GitHub-Actions-and-Dungeons/security-hardening.png b/GitHub-Actions-and-Dungeons/security-hardening.png new file mode 100755 index 0000000..a4692ba Binary files /dev/null and b/GitHub-Actions-and-Dungeons/security-hardening.png differ diff --git a/GitHub-Actions-and-Dungeons/settings-actions-general.png b/GitHub-Actions-and-Dungeons/settings-actions-general.png new file mode 100755 index 0000000..2e3fc29 Binary files /dev/null and b/GitHub-Actions-and-Dungeons/settings-actions-general.png differ diff --git a/GitHub-Actions-and-Dungeons/ssh-agent-on-windows.html b/GitHub-Actions-and-Dungeons/ssh-agent-on-windows.html index d2938dd..623abb7 100755 --- a/GitHub-Actions-and-Dungeons/ssh-agent-on-windows.html +++ b/GitHub-Actions-and-Dungeons/ssh-agent-on-windows.html @@ -167,7 +167,7 @@
-
最後の行は、クローンに成功した場合にREADMD.md
を表示したい、という意図だが、成功しないので意味が無い。結果は次のようになった:
最後の行は、クローンに成功した場合にREADME.md
を表示したい、という意図だが、成功しないので意味が無い。結果は次のようになった:
Cloning into 'private-repository-example'...
Host key verification failed.
fatal: Could not read from remote repository.
@@ -210,7 +210,8 @@ ssh-agentで別のプライベートリポジトリのクローン
成功した。
-☕ 少し前までは、この段階で環境変数GIT_SSH
の設定が必要だったのだが、現在はその必要が無くなった。GitHub Actionsの世界は少しずつ良くなっているようだ。
+☕
+少し前までは、この段階で環境変数GIT_SSH
の設定が必要だったのだが、現在はその必要が無くなった。GitHub Actionsの世界は少しずつ良くなっているようだ。
別のプライベートLFSリポジトリのクローン
今度は、別のプライベートリポジトリCをクローンしてみよう。ただし、リポジトリCはGit LFSを用いている。そう、説明はなかったが、前のセクションのリポジトリBはLFSを使っていなかった。
@@ -267,7 +268,8 @@ 別のプライベートLFSリポジトリのクローン
成功した。
-☕ 少し前までは、この段階でも環境変数GIT_SSH
の設定が必要だったのだが、現在はその必要が無くなった。
+☕
+少し前までは、この段階でも環境変数GIT_SSH
の設定が必要だったのだが、現在はその必要が無くなった。
なお、actions/checkoutを用いる場合は、次のようにオプションlfs: true
の追加が必要になることに注意:
steps:
@@ -293,10 +295,10 @@ 別の複数のプライベートリポジトリをクローンする
- リポジトリBのキーを
ssh-add
で登録
- リポジトリBをクローン
-- リポジトリBのキーを
ssh-add
で削除
+- リポジトリBのキーを
ssh-add -d
で削除
- リポジトリCのキーを
ssh-add
で登録
- リポジトリCをクローン
-- リポジトリCのキーを
ssh-add
で削除
+- リポジトリCのキーを
ssh-add -d
で削除
- ⋮
ところで、ローカルでビルドする際は、デプロイキーを用いることなく、二つのリポジトリをクローンできるのが望ましい。ワークフローファイルでもローカルと同じような手順でチェックアウトしたいので、ssh-agent
を用いるのをやめて、別の方法を試してみよう。
@@ -396,7 +398,8 @@ 別の複数のプライベートリポジトリをクローンする
git config
の設定内容と、~/.ssh/config
の中身を確認してから、リポジトリBとCをチェックアウトした。正しくチェックアウトできている。
-☕ GitHub公式ドキュメントでも“1つのサーバー上で複数のリポジトリを利用する”で複数のデプロイキーを扱う別の方法を紹介している。しかし、その方法だと、ローカルの~/.ssh/config
も変更することになるし、git clone
の際にリポジトリのURLとして偽のURLを指定することになる。また別の面倒を引き寄せたくなければ、避けたほうが良い。
+☕
+GitHub公式ドキュメントでも“1つのサーバー上で複数のリポジトリを利用する”で複数のデプロイキーを扱う別の方法を紹介している。しかし、その方法だと、ローカルの~/.ssh/config
も変更することになるし、git clone
の際にリポジトリのURLとして偽のURLを指定することになる。また別の面倒を引き寄せたくなければ、避けたほうが良い。
webfactory/ssh-agentで別の複数のプライベートリポジトリをクローンする
しかし、このような「工夫」をワークフローファイルに記述するのは煩雑だ。同じことをマーケットプレイスのwebfactory/ssh-agentを次のように使って実現してみよう:
@@ -499,7 +502,7 @@ webfactory/ssh-agentで別の複数のプライベートリポジトリを
-
webfactory/ssh-agentの説明によると、次のように.ssh/known_hosts
を生成するという記述がある:
+webfactory/ssh-agentの説明によると、次のように~/.ssh/known_hosts
を生成するという記述がある:
This action
@@ -547,6 +550,16 @@ webfactory/ssh-agentで別の複数のプライベートリポジトリを
成功した。そして、やっと本題に入れる。
+
+🚧
+webfactory/ssh-agentを本格的に使用する場合、リポジトリをそれぞれのオーガナイゼーションにコピー(フォーク)してから使うべきである。攻撃者がwebfactoryのアカウントを乗っ取り、マーケットプレイスのアクションを悪意をもって書き換え、プライベートキーとそのプライベートリポジトリのURLを抜いてしまう、というリスクを排除するためである。これはwebfactoryに限らず、GitHub公式のアクション以外の全てのサードパーティ製アクションに当てはまることだ。
+参考までに、アクションのリポジトリをプライベートにコピーして使うためのための設定を次に示す:
+コピーしたアクションのプライベートリポジトリの設定
+
+- Settings ➜ Actions ➜ General ➜ Access で “Allow your-organization, and select non-your-organization, actions and reusable workflows” を選択して保存する。
+
+もしくは、プライベートなリポジトリにコピーする代わりに、バージョンをSHA-1ハッシュで指定しても良い。ただし、その場合でも根本的なビジネスのリスクとして、依存している公開されているアクションが突然消失する可能性(例: 開発元の作成者がリポジトリを消してしまう、など)を認識しておくべきである。さらに、プライベートなコピーにしろSHA-1ハッシュ指定にしろ、使うアクションがその依存関係により参照する別の「何か」が問題にならないかについて注意する必要もある。セキュリティ強化に関する詳細は、公式の「Using third-party actions — Security hardening for GitHub Actions」を参照。
+
混ぜるな危険
最後に、マーケットプレイスのactions/checkoutとwebfactory/ssh-agentを組み合わせて、プライベートリポジトリをチェックアウトしてみよう。最初に、webfactory/ssh-agentでリポジトリCをチェックアウトするための準備として、デプロイキーを次のように登録する:
steps:
@@ -711,7 +724,7 @@ 混ぜるな危険
-なんと、actions/checkoutは、デプロイキーを指定した場合、SSHにC:\Windows\System32\OpenSSH\ssh.exe
を使用するようだ。Windowsにはssh
の実装がいくつかあるが、OpenSSH版の実装とGit for Windows版の実装は互換性が無い。OpenSSHのssh
とGit for Windowsのssh-agent
を一緒に使うことはできない。互換性が無い理由はちゃんと調べてないが、おそらくプロセス間通信で使うプロトコルが違うのだろう(だとすると、何故同じ環境変数を使っているだろう? よく経緯はわからないが、まともではないことは間違いない)。
+なんと、actions/checkoutは、デプロイキーを指定した場合、SSHにC:\Windows\System32\OpenSSH\ssh.exe
を使用するようだ。Windowsにはssh
の実装がいくつかあるが、OpenSSH版の実装とGit for Windows版の実装は互換性が無い。OpenSSHのssh
とGit for Windowsのssh-agent
を一緒に使うことはできない。互換性が無い理由はちゃんと調べてないが、おそらくプロセス間通信で使うプロトコルが違うのだろう(だとすると、何故同じ環境変数を使っているのだろう? よく経緯はわからないが、まともではないことは間違いない)。
まとめると、Windowsランナーの場合:
bash
からssh-agent
を起動すると、Git for Windowsの実装の実行ファイルがバックグラウンドで動作する(ように環境変数PATH
が設定されている)。
diff --git a/index.html b/index.html
index d0b9ff3..02a1e01 100644
--- a/index.html
+++ b/index.html
@@ -104,5 +104,6 @@ Maroontress Fast Software
Last modified: Sat Jan 21 15:56:59 JST 2012
+