Comme vous l'avez vu, sur le papier AmazonS3 est très simple :
on peut stocker des fichiers dans des buckets ;
on peut lire et télécharger ces fichiers sur Internet.
Lorsqu'il est couplé au service IAM, on peut définir qui a le droit de lire des buckets, télécharger les fichiers, etc.
Sauf que ce n’est jamais aussi simple…
Bien qu’IAM soit en effet le service central qui régit les droits d’accès sur AWS., certains services tels qu'Amazon S3 offrent également la possibilité de définir des droits d’accès, en complément des politiques du service IAM.
C’est là que cela devient intéressant.
La gestion des droits sur Amazon S3 est un véritable sujet d’actualité. Ceux qui ont laissé des buckets ouverts alors qu'ils y stockaient des données personnelles s'en sont mordu les doigts. Cela arrive plus souvent qu'on ne le pense.
Définissez les différents types de policy
Les droits d'accès à un bucket et à ses fichiers sont déterminés par un processus assez complexe de politiques. Je vais tenter de vous le simplifier. 😜
Il y a 2 types de règles :
politique IAM qu’on a vue dans le chapitre précédent. Elle définit ce qu'un utilisateur a le droit de faire ;
stratégie de ressource : elle définit ce qu'on a le droit de faire sur une ressource d’un service AWS, par exemple un bucket S3.
... cela revient au même, non ?
Oui, mais la politique IAM est centrée sur l'utilisateur, tandis que la stratégie de ressource est centrée sur la ressource (le bucket ou le fichier).
Avec un exemple, cela sera sûrement plus clair :
politique IAM : "Jennifer a le droit de lire et modifier tous les fichiers dans le bucket A, ainsi que d'ajouter des fichiers PNG dans le bucket B" ;
stratégie de ressource : "Dans le bucket A, Jennifer a le droit de lire et modifier tous les fichiers, tandis que Patrick a le droit uniquement d'ajouter des fichiers.".
Qui l’emporte si une politique autorise l’accès tandis que l’autre l’interdit ? Dans AWS, l’accès le plus restreint l’emporte toujours. Si Jennifer a une politique IAM qui l’autorise à télécharger un fichier, mais qu’il y a une stratégie de bucket qui lui interdit l’accès, Jennifer reçoit une erreur, et vice versa.
En pratique, je vous encourage à toujours utiliser les politiques IAM pour accorder les accès à vos utilisateurs et rôles IAM. Les stratégies de buckets vont servir principalement à autoriser l’accès au reste d’Internet (eh oui, les visiteurs de votre site web ne sont pas déclarés dans votre compte AWS... heureusement).
Cela se traduirait donc ainsi :
politique IAM: "Jennifer dans l’équipe de marketing peut modifier les images dans le bucket A” ;
stratégie de bucket : “Tout Internet peut lire les images dans le bucket A”.
Dans la suite de ce chapitre, je vous propose que l'on s'intéresse aux stratégie de buckets.
Prenez en main une stratégie de bucket
Voici une stratégie de bucket très simple. Elle est écrite au format JSON :
{
"Version":"2012-10-17",
"Statement": [
{
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::examplebucket/*"]
}
]
}
Décortiquons-la !
Version : c'est le numéro de version de la policy. Ne mettez pas la date du jour, copiez la même date que moi (cela revient en gros à dire "j'utilise la version 3 du système de policy").
Statement : ce sont les règles de la policy. Ici, il y en a une seule. Voyons ce que ça dit à l'intérieur :
Effect : Allow (autoriser) ou Deny (refuser) ;
Principal : le nom de l'utilisateur à qui on donne le droit. Ici, l'étoile * signifie "Tout le monde, y compris le grand public sur Internet sans compte AWS" ;
Action : c'est l'action que l'on veut autoriser (il peut y en avoir plusieurs). Ici,
s3:GetObject
permet de télécharger un objet (un fichier). La liste des actions peut être retrouvée dans la doc. Oui, il y en a beaucoup ! Parmi les plus importantes, citons :s3:DeleteObject
: autorise la suppression des fichiers,s3:GetObject
: autorise la lecture des fichiers et leur téléchargement,s3:PutObject
: autorise l'ajout de fichiers,s3:ListBucket
: autorise la récupération du nom de tous les fichiers dans le bucket,s3:ListAllMyBuckets
: autorise l'affichage de la liste de tous les buckets ;
Resource : le nom de la ressource qui est autorisée. Il y a un format un peu spécial. Ici,
arn:aws:s3:::examplebucket/*
indique qu'on effectue l'autorisation sur tous les fichiers (*
) du bucket nomméexamplebucket
.
Écrire une stratégie (policy) S3 demande un peu d'entraînement. Là, vous avez vu une stratégie très simple.
J'ai réfléchi à la question dans tous les sens, et je pense que le meilleur moyen de comprendre est encore de prendre des exemples. Voyons donc quelques exemples ensemble.
Découvrez des stratégies
Apprenons à lire quelques stratégies !
Exemple 1
{
"Version": "2012-10-17",
"Id": "ExamplePolicy01",
"Statement": [
{
"Sid": "ExampleStatement01",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::Account-ID:user/Dave"
},
"Action": [
"s3:GetObject",
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::examplebucket/*",
"arn:aws:s3:::examplebucket"
]
}
]
}
Cette policy autorise l'utilisateur Dave (créé sur AWS IAM) à lire un objet, connaître la localisation d'un bucket et lister le contenu du bucket. Si vous vous demandez comment je connais la signification des actions, c'est parce que j'ai lu la doc, moi).
Les ressources qui sont affectées sont examplebucket et tous ses fichiers à l'intérieur.
Exemple 2
{
"Version":"2012-10-17",
"Id":"ExamplePolicy02",
"Statement":[
{
"Effect":"Allow",
"Principal":{
"AWS":"*"
},
"Action":"s3:GetObject",
"Resource":"arn:aws:s3:::my-brand-new-bucket/public/*"
},
{
"Effect":"Allow",
"Principal":{
"AWS":"arn:aws:iam::Account-ID:user/Dave"
},
"Action":[
"s3:PutObject",
"s3:DeleteObject"
],
"Resource":"arn:aws:s3:::my-brand-new-bucket/*"
}
]
}
Cette policy autorise tout le monde à lire les objets dans le dossier "public" de "my-brand-new-bucket". Cela veut dire que n'importe quel internaute pourra télécharger les fichiers du dossier "public" de ce bucket, s'il connaît son URL. Si vous hébergez les images de votre site sur Amazon S3, vous aurez sûrement besoin de donner ce genre de droit.
Cette policy donne aussi d'autres autorisations (vous pouvez voir qu'il y a 2 statements). Elle dit que Dave peut ajouter et supprimer des fichiers partout dans ce bucket.
En résumé : tout le monde peut lire les fichiers dans "public", mais seul Dave peut en ajouter ou en supprimer.
Activez votre première stratégie
Tout cela c'est bien beau, mais comment mettre en place les stratégies ?
Si vous voulez ajouter une policy au format JSON pour un bucket, comme on vient de le voir, il faut aller dans le bucket, onglet "Autorisations" / "Stratégies de compartiment" :
À titre d’exemple, nous allons autoriser tout Internet à télécharger les fichiers stockés dans le répertoire “public” de notre bucket mateotestbucket.
Par défaut, AWS ne permet pas de rendre un bucket public via des stratégies de compartiment. Il faut d’abord désactiver cette protection au niveau du bucket, afin de signaler à AWS que nous souhaitons intentionnellement exposer des données sur Internet. Dans la section “Bloquer l’accès public”, cliquez sur “Modifier”.
Puis décochez toutes les cases et cliquez sur Sauvegarder.
Rendez-vous ensuite plus bas dans la stratégie de compartiment.
Cliquez sur “Modifier” afin d’accéder à l’éditeur en ligne :
La stratégie ci-dessus autorise la lecture de fichiers par tout le monde dans le bucket. Elle rend donc le bucket public.
Une fois la stratégie enregistrée, elle est immédiatement activée (s'il n'y a pas d'erreurs). Amazon S3 m'avertit que du coup le bucket est public, et qu'il faut être attentif à ne pas y inclure de données confidentielles.
Nous venons de voir une courte introduction aux règles d'accès dans Amazon S3. Cela devrait, je l'espère, vous aider à naviguer un peu au début (je vous avoue que j'étais complètement perdu quand j'ai démarré !). N'hésitez pas à lire la documentation pour vous renseigner plus en détail !
En résumé
Une politique IAM définit les accès attribués à un utilisateur donné.
Une stratégie de ressource définit qui peut agir sur cette ressource.
Il est recommandé de toujours privilégier les politiques IAM pour gérer les accès AWS. Les stratégies de ressources sont adaptées pour gérer l'accès public aux ressources, ou autoriser des comptes AWS secondaires.
Dans le prochain et dernier chapitre, je vous propose de mettre de côté l’aspect opérationnel d’AWS pour nous focaliser sur l’un des services les plus importants : le service de facturation. Nous verrons comment économiser 40, 50 ou même 60 % de la facture en jouant sur certaines options.