Jenkins: 403 Er is geen geldige kruimel in het verzoek opgenomen

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 trueOm Crumbissuer toe te voegen
* falseanders.

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:

https:/ /javadoc.io/doc/com.offbytwo.jenkins/jenkins-client/latest/com/offbytwo/jenkins/JenkinsServer.html


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-Hosten X-Forwarded-Portheaders 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.

Other episodes