サマリー
- JenkinsにはGroovyを実行する機能があるが、任意のコードの実行を防ぐため、実行できるメソッドを制限する Groovy Sandbox という仕組みがある。
- Groovy Sandbox を有効にするには、Authorize Project plugin で特定のユーザ権限で動作させる必要がある
- cronのように自動起動するジョブは SYSTEM として実行され Sandbox で実行できないため
- Sandboxで実行する場合、許可するメソッドを事前に設定しておき、意図しないメソッドの呼び出しに気付けるようにする運用になる
- JCasC には Authorize Project plugin と Script Security Plugin の scriptApproval を設定する方法がない
- とはいえ、この設定は一度設定したら変更することもないはずなので、Jenkins起動前に事前にXMLを入れておけばいいよという話
Authorize Project plugin
- プロジェクトごとに特定のユーザの権限でジョブを実行させる設定ができるようになるプラグイン
- QueueItemAuthenticator が追加され、各プロジェクトで実行ユーザの指定ができる
- cronのように自動実行されるジョブは SYSTEM として実行される
- SYSTEM で動くと Sandbox 実行されないが、このプラグインで実行ユーザを指定すると Sandbox の対象になる
- Groovy SandBox を使う場合、このプラグインと組み合わせることが重要になる
- このプラグインの設定を JCasC で行うことができない (今後対応されるかもしれないが)
- 現状最も簡単な設定方法はJenkins起動前に JENKINS_HOME/jenkins.security.QueueItemAuthenticatorConfiguration.xml を作っておく方法
- DockerイメージのJenkinsを使う場合も JENKINS_HOME は外部のボリュームをマウントすることが多いので、そちらのおいておくか、エントリーポイントのスクリプト内でコピーする
設定例
<?xml version='1.1' encoding='UTF-8'?>
<jenkins.security.QueueItemAuthenticatorConfiguration>
<authenticators>
<org.jenkinsci.plugins.authorizeproject.ProjectQueueItemAuthenticator plugin="authorize-project@1.3.0">
<strategyEnabledMap>
<entry>
<string>org.jenkinsci.plugins.authorizeproject.strategy.SpecificUsersAuthorizationStrategy</string>
<boolean>true</boolean>
</entry>
<entry>
<string>org.jenkinsci.plugins.authorizeproject.strategy.TriggeringUsersAuthorizationStrategy</string>
<boolean>false</boolean>
</entry>
<entry>
<string>org.jenkinsci.plugins.authorizeproject.strategy.SystemAuthorizationStrategy</string>
<boolean>false</boolean>
</entry>
<entry>
<string>org.jenkinsci.plugins.authorizeproject.strategy.AnonymousAuthorizationStrategy</string>
<boolean>false</boolean>
</entry>
</strategyEnabledMap>
</org.jenkinsci.plugins.authorizeproject.ProjectQueueItemAuthenticator>
</authenticators>
</jenkins.security.QueueItemAuthenticatorConfiguration>
Script Security Plugin
- Jenkinsで実行されるGroovyスクリプトを任意実行できないように呼び出せるメソッドの制限ができるプラグイン
- Job DSL plugin などでGroovyを実行する際にも適用されるため、このプラグインを入れている場合、Groovy Sandbox で実行する必要が出てくる
- 許可するメソッドは scriptApproval のWebUI上で設定できるが、Administrator権限が必要。
- Administrator権限を持っているとJenkinsを任意に操作できるため、scriptApprovalのためだけにAdministrator権限を与えたくないと思う
- scriptApprovalは単なるXMLの設定であり、事前にどのメソッドの呼び出しを許すかわかっているのであれば、同じくJENKINS_HOMEにおいておけば良い。
<?xml version='1.1' encoding='UTF-8'?>
<scriptApproval plugin="script-security@1.66">
<approvedScriptHashes/>
<approvedSignatures>
<string>staticField groovy.io.FileType DIRECTORIES</string>
</approvedSignatures>
<aclApprovedSignatures>
<string>method groovy.lang.GroovyObject getProperty java.lang.String</string>
<string>method groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object</string>
</aclApprovedSignatures>
<approvedClasspathEntries/>
<pendingScripts/>
<pendingSignatures/>
<pendingClasspathEntries/>
</scriptApproval>