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 @@

ssh-agentで別のプライベートリポジトリのクローン

GitHubで見る

-

最後の行は、クローンに成功した場合に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で別の複数のプライベートリポジトリを

GitHub Actionsの結果

-

webfactory/ssh-agentの説明によると、次のように.ssh/known_hostsを生成するという記述がある:

+

webfactory/ssh-agentの説明によると、次のように~/.ssh/known_hostsを生成するという記述がある:

This action

    @@ -547,6 +550,16 @@

    webfactory/ssh-agentで別の複数のプライベートリポジトリを

    GitHub Actionsの結果

成功した。そして、やっと本題に入れる。

+
+

🚧

+

webfactory/ssh-agentを本格的に使用する場合、リポジトリをそれぞれのオーガナイゼーションにコピー(フォーク)してから使うべきである。攻撃者がwebfactoryのアカウントを乗っ取り、マーケットプレイスのアクションを悪意をもって書き換え、プライベートキーとそのプライベートリポジトリのURLを抜いてしまう、というリスクを排除するためである。これはwebfactoryに限らず、GitHub公式のアクション以外の全てのサードパーティ製アクションに当てはまることだ。

+

参考までに、アクションのリポジトリをプライベートにコピーして使うためのための設定を次に示す:

+

コピーしたアクションのプライベートリポジトリの設定

+ +

もしくは、プライベートなリポジトリにコピーする代わりに、バージョンを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 @@ 

混ぜるな危険

GitHub Actionsの結果

-

なんと、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 +