Scurta descriere:
Pentru a depana erorile Acces refuzat, determinați dacă distribuția dvs. este
numele de domeniu de origine este un punct final al site-ului web S3 sau un API REST S3
punct final. Urmați acești pași pentru a determina tipul punctului final:
- Deschideți consola CloudFront.
- Alegeți distribuția dvs. CloudFront, apoi alegeți Setări de distribuție.
- Alegeți fila Origins and Origin Groups.
- Alegeți fila Origins and Origin Groups.
Examinați numele de domeniu sub Nume și cale de domeniu de origine, apoi
determinați tipul punctului final pe baza formatului numelui de domeniu.
Punctele finale API REST folosesc acest format:
DOC-EXEMPLU-BUCKET.s3.amazonaws.com
Notă: Asigurați-vă că urmați regulile pentru denumirea compartimentelor Amazon S3.
Punctele finale ale site-ului folosesc acest format:
DOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com
Notă: În funcție de regiunea AWS, formatul punctului final poate folosi formatul liniuță (s3-site-web-Regiune) sau formatul punct
(s3-site-ul web.Regiune).
Dacă distribuția dvs. utilizează un punct final API REST, vedeți că folosesc un S3
Punctul final al API-ului REST ca origine a distribuției mele CloudFront. De ce
Primesc erori 403 Acces refuzat?
Dacă distribuția dvs. utilizează un punct final de site, verificați următoarele
cerințe pentru a evita erorile cu acces refuzat:
- Obiectele din găleată trebuie să fie accesibile publicului.
- Obiectele din găleată nu pot fi criptate de AWS Key Management Service (AWS KMS).
- Politica compartimentului trebuie să permită accesul la s3:GetObject.
- Dacă politica compartimentului acordă acces public la citire, atunci contul AWS care deține compartimentul trebuie să dețină și obiectul.
5.Obiectele solicitate trebuie să existe în găleată.
- Amazon S3 Block Public Access trebuie dezactivat pe bucket.
- Dacă Requester Pay este activat, atunci cererea trebuie să includă parametrul cerere-plătitor.
- Dacă utilizați un antet Referer pentru a restricționa accesul de la CloudFront la originea dvs. S3, apoi examinați antetul personalizat.
Notă: Dacă nu doriți să permiteți public (anonim) accesul la obiectele dvs. S3, apoi modificați configurația pentru a utiliza API-ul S3 REST
punctul final ca origine a distribuției dvs. Apoi, configurați-vă
distribuție și compartiment S3 pentru a restricționa accesul folosind un acces la origine
identitate (OAI). Pentru instrucțiuni, consultați Utilizarea unui punct final API REST ca
origine cu acces restricționat de un OAI în Cum folosesc CloudFront pentru
servi un site web static găzduit pe Amazon S3?
Rezoluţie
Obiectele din găleată trebuie să fie accesibile publicului
O distribuție care utilizează un punct final de site web acceptă numai public
continut accesibil. Pentru a determina dacă un obiect din găleata S3 este
accesibil public, deschideți adresa URL a obiectului într-un browser web. Sau tu
poate rula o comandă curl pe adresa URL.
Următorul este un exemplu de adresă URL a unui obiect S3:
http://DOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com/index.html
Dacă browserul web sau comanda curl returnează o eroare Acces refuzat,
atunci obiectul nu este accesibil publicului.
Permiteți accesul public de citire la obiect într-unul dintre următoarele moduri:
- Creați o politică de compartiment care permite accesul public la citire pentru toate obiectele din compartiment.
- Utilizați consola Amazon S3 pentru a permite accesul public la citire pentru obiect.
- Obiectele din găleată nu pot fi criptate AWS KMS
- Distribuțiile CloudFront nu acceptă obiecte criptate AWS KMS. Trebuie să eliminați criptarea KMS de la obiectele S3 pe care doriți să le faceți
servi folosind distribuția.
Notă: În loc să utilizați criptarea AWS KMS, utilizați AES-256 pentru a vă cripta obiectele.
Utilizați una dintre următoarele moduri pentru a verifica dacă există un obiect din găleată
Criptat KMS:
Utilizați consola Amazon S3 pentru a vizualiza proprietățile obiectului. Revizuire
caseta de dialog Criptare. Dacă este selectat AWS-KMS, atunci obiectul este
criptat KMS. Rulați comanda head-object utilizând linia de comandă AWS
Interfață (AWS CLI). Dacă comanda returnează ServerSideEncryption ca
aws:kms, atunci obiectul este criptat KMS. Notă: Dacă primiți erori
când rulați comenzi AWS CLI, asigurați-vă că utilizați cel mai mult
versiunea recentă a AWS CLI. Pentru a schimba criptarea obiectului
setări folosind consola Amazon S3, consultați Cum adaug criptare la
un obiect S3?
Pentru a modifica setările de criptare ale obiectului utilizând AWS CLI,
mai întâi verificați că găleata obiectului nu are criptare implicită.
Dacă găleata nu are criptare implicită, atunci rulați următoarele
comandă pentru a elimina criptarea obiectului prin copierea obiectului
in sine:
aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html
Avertizare: Copierea obiectului peste el însuși elimină setările pentru clasa de stocare și
site-ul-redirecționare-locație. Pentru a menține aceste setări în nou
obiect, asigurați-vă că specificați în mod explicit clasa de stocare sau
valorile site-ului-redirecționare-locație în cererea de copiere.
Politica compartimentului trebuie să permită accesul la s3:GetObject Pentru a utiliza a
distribuție cu un punct final al site-ului web S3, politica dvs. nu trebuie
au o declarație deny care blochează accesul public de citire la
s3: Acțiunea GetObject.
Chiar dacă aveți o declarație explicită allow pentru s3:GetObject în dvs
politica de grup, confirmați că nu există o negare explicită conflictuală
afirmație. O declarație de negare explicită înlocuiește întotdeauna o declarație explicită
permite declarația.
Urmați acești pași pentru a vă revizui politica privind compartimentul pentru s3:GetObject:
Deschideți găleata S3 din consola Amazon S3.
Alegeți fila Permisiuni.
Alegeți Politica compartimentului.
Examinați politica grupului pentru declarații cu „Action”: „s3:GetObject” sau „Action”: „s3:*”.
Următorul exemplu de politică conține o declarație explicită allow for
acces public la s3:GetObject. Cu toate acestea, există și o negare explicită
declarație pentru s3:GetObject care blochează accesul, cu excepția cazului în care cererea este
dintr-un anume Amazon Virtual Private Cloud (Amazon VPC).
{
„Versiune”: „2008-10-17”,
„Id”: „PolicyForCloudFrontPrivateContent”,
"Afirmație": [
{
„Sid”: „Permiteți-OAI-Acces-la-bucket”,
„Efect”: „Permite”,
„Principal”: {
„AWS”: „arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAF5XXXXXXXXX”
},
„Acțiune”: „s3:GetObject”,
„Resurse”: [
„arn:aws:s3:::DOC-EXEMPLU-GALETE/*”
]
},
{
„Sid”: „Permiteți-Public-Accesul-la-grupă”,
„Efect”: „Permite”,
„Principal”: „*”,
„Acțiune”: „s3:GetObject”,
„Resurse”: [
„arn:aws:s3:::DOC-EXEMPLU-GALETE/*”
]
},
{
„Sid”: „Doar acces-la-specific-VPCE”,
„Efect”: „Nega”,
„Principal”: „*”,
„Acțiune”: „s3:GetObject”,
„Resurse”: [
„arn:aws:s3:::DOC-EXEMPLU-GALETE/*”
],
"Condiție": {
„StringNotEquals”: {
"aws:sourceVpce": "vpce-1a2b3c4d"
}
}
}
]
}
- Modificați politica compartimentului pentru a elimina sau edita instrucțiunile care blochează accesul public la citire la s3:GetObject.
Notă: CloudFront memorează în cache rezultatele unei erori de acces refuzat pentru perioada de timp specificată în TTL minim de memorare în cache a erorii. The
valoarea implicită este de un minut. După eliminarea unei declarații de negare din
politică, puteți rula o invalidare a distribuției dvs. către
eliminați obiectul din cache.
Dacă politica compartimentului acordă acces public la citire, atunci contul AWS
care deține găleata trebuie să dețină și obiectul Pentru o politică găleată să
permite accesul public de citire la obiecte, contul AWS care deține
găleată trebuie să dețină și obiectele. O găleată sau un obiect este deținut de
contul de identitate AWS Identity and Access Management (IAM) care
a creat găleata sau obiectul.
Notă: cerința de proprietate asupra obiectului se aplică accesului public de citire acordat printr-o politică de compartiment. Nu se aplică citirii publice
accesul acordat de lista de control al accesului (ACL) a obiectului.
Urmați acești pași pentru a verifica dacă găleata și obiectele au același lucru
proprietar:
- Rulați această comandă AWS CLI pentru a obține ID-ul canonic S3 al proprietarului compartimentului:
aws s3api list-buckets --query Owner.ID
- Rulați această comandă pentru a obține ID-ul canonic S3 al proprietarului obiectului:
Notă: Acest exemplu arată un singur obiect, dar puteți utiliza lista
comanda pentru a verifica mai multe obiecte.
aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.html
- Dacă ID-urile canonice nu se potrivesc, atunci găleata și obiectul au proprietari diferiți.
Notă: De asemenea, puteți utiliza consola Amazon S3 pentru a verifica găleata și
proprietarii de obiecte. Proprietarii se găsesc în fila Permisiuni a
găleata sau obiectul respectiv.
Urmați acești pași pentru a schimba proprietarul obiectului în proprietarul găleții:
- Din contul proprietarului obiectului, rulați această comandă pentru a prelua permisiunile ACL atribuite obiectului:
aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name
- Dacă obiectul are permisiuni ACL de control complet al proprietarului de găleți, atunci treceți la pasul #3. Dacă obiectul nu are
bucket-owner-full-control ACL permisiuni, apoi rulați această comandă de la
contul proprietarului obiectului:
aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control
- Din contul proprietarului găleții, rulați această comandă pentru a schimba proprietarul obiectului prin copierea obiectului peste el:
aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html
Obiectele solicitate trebuie să existe în găleată Dacă un utilizator nu are permisiuni s3:ListBucket, atunci utilizatorul primește acces interzis
erori pentru obiectele lipsă în loc de erori 404 Not Found. Rulați
head-object Comanda AWS CLI pentru a verifica dacă un obiect există în
găleată.
Notă: Confirmați că cererea de obiect trimisă către CloudFront se potrivește exact cu numele obiectului S3. Numele obiectelor S3 sunt sensibile la majuscule. Dacă
cererea nu are numele corect al obiectului, atunci Amazon S3 răspunde
ca și cum obiectul lipsește. Pentru a identifica ce obiect CloudFront
solicită de la Amazon S3, utilizați jurnalul de acces la server.
Dacă obiectul există în găleată, atunci eroarea Acces refuzat nu este
mascarea unei erori 404 Not Found. Verificați alte cerințe de configurare pentru a rezolva eroarea Acces refuzat.
Dacă obiectul nu se află în găleată, atunci eroarea Acces refuzat este
mascarea unei erori 404 Not Found. Rezolvați problema legată de obiectul lipsă.
Notă: Nu este o bună practică de securitate să activați accesul public s3:ListBucket. Activarea accesului public s3:ListBucket permite
utilizatorii să vadă și să enumere toate obiectele dintr-o găleată. Aceasta expune obiectul
detalii despre metadate (de exemplu, cheie și dimensiune) pentru utilizatori, chiar dacă
utilizatorii nu au permisiuni pentru descărcarea obiectului.
Amazon S3 Block Public Access trebuie dezactivat pe bucket Confirmați că nu există setări Amazon S3 Block Public Access
aplicat pe găleată. Aceste setări pot suprascrie permisiunile care
permite accesul public în citire. Setările Amazon S3 Block Public Access pot
se aplică grupelor individuale sau conturilor AWS.
Dacă Requester Pay este activat, atunci cererea trebuie să includă
parametru cerere-plătitor Dacă Solicitantul Plătește este activat pe o găleată, atunci
accesul anonim la găleată nu este permis. Utilizatori din alte persoane
conturile trebuie să specifice parametrul cerere-plătitor atunci când trimit
cereri către găleată. În caz contrar, acești utilizatori primesc un acces refuzat
eroare.
Dacă utilizați un antet Referer pentru a restricționa accesul de la CloudFront la
originea dvs. S3, apoi examinați antetul personalizat Dacă utilizați
Antet referitor pentru a restricționa accesul de la CloudFront la site-ul dvs. S3
originea punctului final, verificați valoarea secretă sau jetonul setat pe compartimentul S3
politică. Apoi, confirmați că valoarea secretă sau simbolul se potrivește cu valoarea
pe antetul personalizat de origine CloudFront.
Dacă utilizați o declarație explicită de respingere în politica compartimentului, atunci
confirmați că există și o declarație de autorizare care acordă acces pe bază
pe antetul Referer. Nu puteți acorda acces doar cu un explicit
nega declarația.
De exemplu, următoarea politică de grup oferă acces la originea S3 atunci când cererea conține șirul
"aws:Referer":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER":
{
"Version":"2012-10-17",
"Id":"Exemplu de politică de referință http",
"Afirmație":[
{
"Sid":"Permite obținerea cererilor care provin din CloudFront meu cu antetul referitor",
"Efect":"Permite",
"Principal":"*",
"Acțiune":"s3:GetObject",
"Resurse":"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
"Condiție":{
"StringLike":{"aws:Referer":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER"}
}
}
]
}
Cu acest exemplu de politică de grup, antetul personalizat de origine CloudFront
trebuie sa fie:
- Antet: Referitor
- Valoare: MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER
Notă:
Exemplul de politică de grup oferă acces public (anonim) la
bucket deoarece Principalul este o valoare wildcard ("Principal":"*").
Cu toate acestea, din cauza declarației de condiție, accesul la originea S3
se acordă numai dacă cererea include antetul Referer și
valoarea antetului se potrivește cu valoarea din politica compartimentului.