Ik heb jenkins als volgt in spinnaker geconfigureerd en de spinnaker-pijplijn ingesteld.
jenkins:
# If you are integrating Jenkins, set its location here using the baseUrl
# field and provide the username/password credentials.
# You must also enable the "igor" service listed separately.
#
# If you have multiple jenkins servers, you will need to list
# them in an igor-local.yml. See jenkins.masters in config/igor.yml.
#
# Note that jenkins is not installed with Spinnaker so you must obtain this
# on your own if you are interested.
enabled: ${services.igor.enabled:false}
defaultMaster:
name: default
baseUrl: http://server:8080
username: spinnaker
password: password
Maar ik krijg de volgende foutmelding wanneer ik de spinnaker-pijplijn probeer uit te voeren.
Uitzondering (Start Jenkins Job)
403 Er is geen geldige kruimel in het verzoek opgenomen
Antwoord 1, autoriteit 100%
Ten slotte heeft dit bericht me geholpen het kruimelprobleem op te lossen, maar Jenkins nog steeds te beveiligen tegen CSRF-aanvallen.
Oplossing voor geen geldige kruimel opgenomen in de aanvraagkwestie
Kortom, we moeten eerst om crumb met authenticatie vragen en dan opnieuw POST API-aanroepen doen met crumb als header, samen met authenticatie.
Zo heb ik het gedaan,
curl -v -X GET http://jenkins-url:8080/crumbIssuer/api/json --user <username>:<password>
Reactie was,
{
"_class":"hudson.security.csrf.DefaultCrumbIssuer",
"crumb":"0db38413bd7ec9e98974f5213f7ead8b",
"crumbRequestField":"Jenkins-Crumb"
}
Dan de post-API met bovenstaande kruiminformatie erin.
curl -X POST http://jenkins-url:8080/job/<job-name>/build --user <username>:<password> -H 'Jenkins-Crumb: 0db38413bd7ec9e98974f5213f7ead8b'
Antwoord 2, Autoriteit 72%
Om dit probleem op te lossen, gewijzigd “Voorkom cross-site-aanvraag vervalsingen” in Jenkins.com/configuresecuritysectie en het begon te werken.
Antwoord 3, Autoriteit 60%
Deze oplossing is veilig om
te gebruiken
kwam langs dit probleem toen we in Jenkins veranderden om toegankelijk te zijn via omgekeerde proxy.
Er is een optie in de “Configureer Global Security ” dat “Proxy-compatibiliteit inschakelen ”
Dit hielp met mijn probleem.
Antwoord 4, Autoriteit 42%
Crumb is niets anders dan toegang-token. Hieronder is de API om de kruimel
te krijgen
https://jenkins.xxx.xxx.xxx/crumbIssuer/api/json
// Vervang het door met je Jenkins-URL en maak een telefoontje in je postbode of rust-api-beller.
Hiermee genereert u de uitvoer zoals:
{
"_class": "hudson.security.csrf.DefaultCrumbIssuer",
"crumb": "ba4742b9d92606f4236456568a",
"crumbRequestField": "Jenkins-Crumb"
}
Hieronder staan meer details en koppeling met betrekking tot hetzelfde:
Hoe u kunt aanvragen voor kruimelmerken voor Jenkins
Jenkins Wiki-pagina:
https://wiki.jenkins-ci.org/display/jenkins/remote +toegang+api
Als je hetzelfde belt via rest-api-oproep, bekijk dan de onderstaande link waar wordt uitgelegd hoe je een rest-oproep kunt bellen met jenkins-crumb
https ://blog.dahanne.net/2016/05/17/how-to-update-a-jenkins-job-posting-config-xml/
Voorbeeld:
curl -X POST http://anthony:anthony@localhost:8080/jenkins/job/pof/config.xml --data-binary "@config.xml" -data ".crumb=6bbabc426436b72ec35e5ad4a4344687"
Antwoord 5, autoriteit 32%
Voor de nieuwe release van Jenkins moet je de onderstaande oplossing volgen:
https://jenkins .io/doc/upgrade-guide/2.176/#upgrading-to-jenkins-lts-2-176-3
Upgraden naar Jenkins 2.176.2 Verbeterde CSRF-beveiliging
BEVEILIGING-626
CSRF-tokens (kruimels) zijn nu alleen geldig voor de websessie die ze waren
gemaakt om de impact van aanvallers die ze verkrijgen te beperken. Scripts
die een kruimel verkrijgen met behulp van de /crumbIssuer/api URL zal nu niet lukken
acties uitvoeren die zijn beveiligd tegen CSRF, tenzij de scripts het web behouden
sessie-ID in volgende verzoeken. Scripts kunnen in plaats daarvan een API gebruiken
token, waarvoor sinds Jenkins 2.96 geen CSRF-token (kruimel) nodig is.Om deze verbetering uit te schakelen, kunt u de systeemeigenschap instellen
hudson.security.csrf.DefaultCrumbIssuer.EXCLUDE_SESSION_ID naar waar.
Als alternatief kunt u de Strict Crumb Issuer Plugin installeren die:
biedt meer opties om de kruimelvalidatie aan te passen. Het staat toe
de websessie-ID uitsluiten van de validatiecriteria, en in plaats daarvan
bijv. vervangen door op tijd gebaseerde vervaldatum voor vergelijkbare (of zelfs
betere) bescherming tegen CSRF
In mijn geval hielp het bij het installeren van de Strict Crumb Issuer Plugin,
jenkins opnieuw opstarten en een minder strikt beleid toepassen voor de webinterface van Jenkins zoals wordt voorgesteld op de site van de leverancier.
Antwoord 6, autoriteit 24%
Ik heb dit opgelost door API TOKENte gebruiken als basisverificatiewachtwoord. Hier is hoe
curl -v -X POST http://jenkins-url:8080/job/<job-name>/buildWithParameters?param=value --user <username>:<token>
Opmerking: om het API TOKENonder Accounts-pictogram te maken -> configureren -> API-token -> Nieuwe token toevoegen
Antwoord 7, autoriteit 10%
Volgens Jenkins-richtlijn
Eerst moet u uw Jenkins-versie controleren of de versie < 2.176.2 volgens de Jenkins-richtlijn zijn CSRF-tokens (crumbs) nu alleen geldig voor de websessie waarin ze zijn gemaakt om de impact van aanvallers die ze verkrijgen te beperken. Scripts die een kruimel verkrijgen met behulp van de /crumbIssuer/api-URL zullen nu geen acties meer uitvoeren die zijn beveiligd tegen CSRF, tenzij de scripts de websessie-ID behouden bij volgende verzoeken.
Als alternatief kunt u de Strict Crumb Issuer Plugin installeren, die meer opties biedt om de kruimelvalidatie aan te passen. Het maakt het mogelijk om de websessie-ID uit te sluiten van de validatiecriteria, en in plaats daarvan b.v. vervangen door een op tijd gebaseerde vervaldatum voor vergelijkbare (of zelfs betere) bescherming tegen CSRF.
Stappen:
- je moet de plug-in genaamd “Strict Crumb Issuer” installeren
- Na installatie start je de jenkins-service opnieuw
- ga naar “Jenkins beheren” –> “Globale beveiliging configureren” –> Selecteer onder CSRF-bescherming “Strict Crumb Issue” in de vervolgkeuzelijst –> Klik op Geavanceerd en schakel alles uit, maar selecteer de optie “Breach Attack voorkomen”. –> Toepassen en opslaan.
- Voer nu je kruimelscript uit.
Het zou nu moeten werken.
Controleer deze afbeelding voor uw referentie
Antwoord 8, autoriteit 6%
Ik heb veel tijd verloren om dit uit te zoeken. Aan het einde heb ik zojuist deze plug-in geïnstalleerd https://plugins.jenkins.io/build-token -root/en bouwtoestemming voor anonieme gebruikers ingeschakeld. Uiteindelijk maakt het niet echt uit omdat de jenkins-instantie achter een VPN zit en ik https://smee.ioom de webhook door te sturen naar de Jenkins-instantie. Ook zit de Jenkins-instantie achter een reverse proxy, dus de optie “Proxycompatibiliteit inschakelen” is ook aangevinkt en de instelling “ignore_invalid_headers” is uitgeschakeld in de Nginx-configuratie op serverniveau. Mijn oplossing delen voor het geval iemand anders ook worstelt. Ik weet zeker dat er betere manieren zijn om het te doen, maar dit is een optie.
Merk op dat met deze plug-in de build-URL is ingesteld op buildByToken/build?job=JobName&token=TokenValueen dat het token wordt gegenereerd in de taakinstellingen.
Dit is in Jenkins 2.235.2 die geen optie heeft om CSRF uit te schakelen.
Antwoord 9, autoriteit 6%
Ik kreeg dezelfde foutmelding “403 Geen geldige kruimel in verzoek opgenomen” toen ik een jenkins-taak aanmaakte vanuit een java-programma met behulp van jenkins-clientbibliotheek, d.w.z. com.offbytwo.jenkins. Toen gebruikte ik jenkins api-token in plaats van het wachtwoord in de volgende code. Nu is het probleem opgelost.
JenkinsServer jServer = new JenkinsServer(new URI(jenkins_url), jnkn_username, jnkn_password);
We kunnen API-token genereren vanuit de Jenkins-console. Profiel > Configureer > API-token (Nieuwe token toevoegen)
Dezelfde API-token kan ook worden gebruikt in plaats van wachtwoord met curl.
curl -v -X POST http://jenkins-url:port/job/<job-name>/buildWithParameters?param=value --user <jen_username>:<jenkins_api_token>
Antwoord 10, autoriteit 6%
Je hebt een procedure van 2 stappen nodig om eerst een kruimel van de server te krijgen en deze vervolgens te gebruiken.
Ik gebruik dit bash-script en curl daarvoor:
#!/bin/bash
# buildme.sh Runs a build Jenkins build job that requires a crumb
# e.g.
# $ ./buildme.sh 'builderdude:monkey123' 'awesomebuildjob' 'http://paton.example.com:8080'
# Replace with your admin credentials, build job name and Jenkins URL
#
# More background:
# https://support.cloudbees.com/hc/en-us/articles/219257077-CSRF-Protection-Explained
USERPASSWORD=$1
JOB=$2
SERVER=$3
# File where web session cookie is saved
COOKIEJAR="$(mktemp)"
CRUMB=$(curl -f -u "$USERPASSWORD" --cookie-jar "$COOKIEJAR" "$SERVER/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,%22:%22,//crumb)")
status=$?
if [[ $status -eq 0 ]] ; then
curl -f -X POST -u "$USERPASSWORD" --cookie "$COOKIEJAR" -H "$CRUMB" "$SERVER"/job/"$JOB"/build
status=$?
fi
rm "$COOKIEJAR"
exit $status
Hier is een voorbeeld van het uitvoeren van dit script met de parameters die je nodig hebt:
$ ./buildme.sh 'builderdude:monkey123' 'awesomebuildjob' 'http://paton.example.com:8080'
Dit script retourneert een foutcode als een van de curl-opdrachten om welke reden dan ook mislukt.
Meer details zijn te vinden van cloudbees
Antwoord 11, Autoriteit 4%
Aangezien deze vraag de eerste, dus link is wanneer u op zoek bent naar “Geen geldige kruimels opgenomen in het verzoek” in Google, denk ik dat het de moeite waard is om te vermelden dat dezelfde fout wordt gegenereerd als u de HTTP-header van de autorisatie weggeeft / vergeten lege gebruikersnaam / wachtwoord:
Relevante foutmeldingen met betrekking tot de autorisatiekop worden alleen gegenereerd wanneer een waarde wordt doorgegeven:
En ja, de kruimel die in de eerste screenshots is aangenomen, is daadwerkelijk geldig; Alles werkt met de juiste gebruikersnaam / wachtwoord:
Dus, niet zeker of dat een bug is of niet, maar “Geen geldige kruimels die op het verzoek is opgenomen” zou ook kunnen betekenen dat u de autorisatiekop per ongeluk bent vergeten.
Jenkins 2.222.3, Ubuntu Server 20.04, Java Runtime 1.8.0_252-8U252-B09-1UBUNU1-B09
Antwoord 12
Voor Java-codes om toegang te krijgen tot Jenkins API zal ik mijn advies laten.
Het antwoord van @santhosh (https://stackoverflow.com/a/60221003/5940655 ) Probleem, dat bestaat uit het wijzigen van TBE Wachtwoord voor token , maar voor zover ik weet is Token nu een oudere manier om het te doen.
Dus ik heb een andere manier geprobeerd en ontdek een oplossing in de Java-code.
Hier deed ik het.
In mijn Java-code gebruik ik “com.offbytwo.jenkins ” pakket en de klasse die ik gebruik is “jenkinsserver “.
Mijn probleem was om een baan te creëren in Jenkins omdat ik er fouten opkwam: “403 Geen geldige kruimels opgenomen in aanvraag ”
Dan vond ik een Booleaanse parameter genaamd crumbflag en passeerde “waar ” erop en alles werkte.
Mijn code was als volgt:
jenkins.createJob(job.getName(), config);
Dan, ik veranderde voor deze Ans werkte als een charme:
jenkins.createJob(job.getName(), config, true);
Deze parameter bevindt zich in bijna alle methoden van dit pakket, door bijvoorbeeld:
- Createjob (String JobName, String Jobxml, Boolean Crumbflag)
- updateJob (string jobnaam, string jobxml, boolean crumbflag)
- renamejob (string oldjobname, string newjobname, boolean crumbflag)
- anderen.
De technische documentatie in de code is:
@param Crumbflag
true
Om Crumbissuer b>toe te voegen
*false
anders.
Ik begreep als je “true ” voor deze parameter passeert, zal het automatisch een kruimel uitgeven.
Nou, de officiële documentatie heeft deze informatie over details, als u dat wenst, kijk hier:
Antwoord 13
Maak eerst een gebruikers-API-token door naar gebruiker–>API-token–>Nieuwe token toevoegen te gaan.
Gebruik dan het onderstaande script om te activeren.
import jenkins,requests
job_name='sleep_job'
jenkins_url = "http://10.10.10.294:8080"
auth = ("jenkins","1143e7efc9371dde2e4f312345bec")
request_url = "{0:s}/job/{1:s}/buildWithParameters".format(jenkins_url,
job_name, )
crumb_data = requests.get("{0:s}/crumbIssuer/api/json".format(jenkins_url),
auth=auth, ).json()
headers = {'Jenkins-Crumb': crumb_data['crumb']}
jenkins_job_params={}
jenkins_job_params['NODE_NAME']='10_10_1_29'
jenkins_job_params['SLEEP_TIME']='1h'
response = requests.post(request_url, data=jenkins_job_params, auth=auth, )
response.raise_for_status()
Antwoord 14
Deze gidslegt uit hoe u genereer een Jenkins-kruimel, sla de cookies op en gebruik zowel de kruimel als de opgeslagen cookies in de volgende verzoeken die authenticatie vereisen. Dit is een must voor Jenkins na V2.176.2
Antwoord 15
Ik had hetzelfde probleem bij het opzetten van een GitHub-project met de plug-in GitHub Pull Request Builder
- Hier is een voorbeeld van het antwoord dat ik kreeg van mijn Jenkins-server
- antwoordinhoud
-
Het probleem deed zich voor omdat mijn Payload-URLeen slash aan het einde
/
miste. -
het toevoegen van een schuine streep aan het einde van de url lost het probleem op
-
uw payload-url zou er zo uit moeten zien
https://jenkins.host.com/ghprbhook/
-
voorbeelden na het toevoegen van een slash
Antwoord 16
Hier is mijn oplossing voor dit probleem ( git hook om jenkins job te starten achter een reverse proxy )
#haal de KRUMB van een eerste oproep en bewaar de sessie-ID in de koekjestrommel:
CRUMB=$(/usr/bin/curl --cookie-jar ./cookie -sX GET https://******.net/crumbIssuer/api/json|cut -d'"' -f8)
#start de JOB:
/usr/bin/curl --cookie ./cookie -X POST https://******.net/job/PROJECTNAME/build -H "Jenkins-Crumb: $CRUMB"
Antwoord 17
Voor mij was de oplossing om de X-Forwarded-Host
en X-Forwarded-Port
headers door te geven
zoals voorgesteld in de reverse-proxy-configuration-troubleshooting hoofdstuk van het handboek.
HaProxy-configuratie, in het gedeelte frontend
:
http-request set-header X-Forwarded-Host %[hdr(host)]
http-request set-header X-Forwarded-Port %[dst_port]
Antwoord 18
Ik had ook een soortgelijk probleem, ik gebruikte een wachtwoord in plaats van een token
.
Bij het bijwerken loste mijn probleem op, het is niet nodig om iets uit te vinken en het onveilig te maken. Hieronder staan de volledige stappen die ik heb gevolgd om jenkins CLI te laten werken-
stap -1:-bereid ENV-vars voor
export JENKINS_URL=http://localhost:8080/
export JENKINS_USER=admin
export JENKINS_PASSWORD=b7f04f4efe5ee117912a1.....
export JENKINS_CRUMB=f360....
export FOLDER=test
Token verkrijgen als-
De API-token voor Jenkins verkrijgen
krijg CRUMB als-
http://localhost:8080/crumbIssuer/api/json
stap-2:-XML-bestand voorbereiden, bestandsnaam creds.xml
<com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl>
<scope>GLOBAL</scope>
<id>TEST-CLI</id>
<username>test</username>
<password>test123</password>
<description>this secret if created confirms that jenkins-cli is working</description>
</com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl>
stap 3:-POST met curl
curl -X POST -u $JENKINS_USER:$JENKINS_PASSWORD -H "Jenkins-Crumb:${JENKINS_CRUMB}" -H 'content-type:application/xml' -d @creds.xml "$JENKINS_URL/job/$FOLDER/credentials/store/folder/domain/_/createCredentials"
Antwoord 19
Ik werk met reverse proxy met nignx. Gewijzigde jenkins-optie in de “Globale beveiliging configureren” die “proxycompatibiliteit inschakelen” Dit is opgelost met mijn probleem.
Antwoord 20
Ga naar Jenkins beheren => Wereldwijde beveiliging configureren.
Verwijder vervolgens het vinkje bij “Voorkom misbruik van vervalsing van verzoeken op verschillende sites“
Antwoord 21
Ik ben tegen hetzelfde probleem aangelopen. Ik hoef alleen mijn browser te vernieuwen, opnieuw in te loggen bij Jenkins, hetzelfde proces te doen en alles werkte.