Для хранения снимков экрана, на данный момент мы используем monosnap), и последующего предоставления клиентам мы используем Amazon S3. Возникла, казалось бы, тривиальная задача - разграничить доступ к S3 хранилищу. Так как на момент написания статьи использовалась учетная запись с т.н. full access правами. Т.е. в любой момент времени пользователь мог удалить все данные, что нас конечно не устраивало. Но не все так просто, доступа к консоли AWS не было, а были доступны лишь Access Key Id и Secret Access Key. Но так как это была учетная запись с полными правами этого было достаточно. Итак, у нас есть 3 бакета и необходимо создать 3х пользователей и дать им права на запись в соответствующий бакет, но при этом они не должны иметь право что-либо удалять в своем бакете. Реализиовать данную задачу как раз и поможет IAM - Identity and Access Management.
Итак в нашем распоряжении CentOS 6 со всеми установленными обновлениями и подключенными репозитариями EPEL/RPMForge/IUS Community
# cat /etc/redhat-release CentOS release 6.6 (Final) # uname -a Linux staging.example.net 2.6.32-504.3.3.el6.x86_64 #1 SMP Wed Dec 17 01:55:02 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
Устанавливаем aws cli
# yum install python-pip python-devel gcc
В принципе gcc не обязательно ставить, но при его наличие, будут собираться модули, обеспечивающие ускорение работы.
# pip install awscli Downloading/unpacking awscli Downloading awscli-1.6.10.tar.gz (282kB): 282kB downloaded Running setup.py egg_info for package awscli Downloading/unpacking botocore>=0.80.0,<0.81.0 (from awscli) Downloading botocore-0.80.0.tar.gz (1.2MB): 1.2MB downloaded Running setup.py egg_info for package botocore ... ... ... Running setup.py install for six no previously-included directories found matching 'documentation/_build' Running setup.py install for pyasn1 Successfully installed awscli botocore bcdoc colorama docutils rsa argparse jmespath python-dateutil ordereddict simplejson six pyasn1 Cleaning up...
Проверяем, что консоль установилась
# aws --version aws-cli/1.6.10 Python/2.6.6 Linux/2.6.32-504.3.3.el6.x86_64
Производим настройку данных, вводим имеющиеся у нас Access Key Id и Secret Access Key.
# aws configure AWS Access Key ID [None]: ICAMLORKAKIAJMHSTVUH AWS Secret Access Key [None]: GsIS4ZSBNUllBEedAT8Qqb+SYCK0sChMaX66dQ8d Default region name [None]: Default output format [None]:
После выполнения этой команды в домашней папке пользователя должен появиться следующий файл
# cat ~/.aws/credentials [default] aws_access_key_id = ICAMLORKAKIAJMHSTVUH aws_secret_access_key = GsIS4ZSBNUllBEedAT8Qqb+SYCK0sChMaX66dQ8d
Проверяем, что все работает корректно. Выводим список доступных бакетов
# aws s3 ls 2015-01-02 08:49:56 alpha01 2015-01-02 08:50:20 omega02 2015-01-02 08:52:25 sigma03
Итак, на данный момент в нашем распоряжении всего один пользователь - root, с полными правами
# aws iam list-users { "Users": [ { "UserName": "root", "Path": "/", "CreateDate": "2014-12-03T09:27:58Z", "UserId": "AIDASOCRCJSKGU6VIDAQF", "Arn": "arn:aws:iam::911345934031:user/root" } ] }
Создаем 3х пользователей для каждого из бакетов
# aws iam create-user --user-name scrnshots-alpha { "User": { "UserName": "scrnshots-alpha", "Path": "/", "CreateDate": "2015-01-02T16:05:18.899Z", "UserId": "AIDAIEIRMQH6HKQ4I5PPA", "Arn": "arn:aws:iam::934091134531:user/scrnshots-alpha" } }
# aws iam create-user --user-name scrnshots-omega { "User": { "UserName": "scrnshots-omega", "Path": "/", "CreateDate": "2015-01-02T16:05:24.496Z", "UserId": "AIDAIDQCAINOCVH5DEQKI", "Arn": "arn:aws:iam::934091134531:user/scrnshots-omega" } }
# aws iam create-user --user-name scrnshots-sigma { "User": { "UserName": "scrnshots-sigma", "Path": "/", "CreateDate": "2015-01-02T16:05:34.284Z", "UserId": "AIDAJCSMV2RO52DR6GBO2", "Arn": "arn:aws:iam::934091134531:user/scrnshots-sigma" } }
Создаем для каждого из пользователей Secret Access Key и Access Key Id
# aws iam create-access-key --user-name scrnshots-alpha { "AccessKey": { "UserName": "scrnshots-alpha", "Status": "Active", "CreateDate": "2015-01-02T16:09:09.602Z", "SecretAccessKey": "eLCXqSZNkVtW/qfibBLd+9wZAKFnzJ7NeY7/8+LL", "AccessKeyId": "AKIAJY24GFHCXM3CTLAJ" } }
# aws iam create-access-key --user-name scrnshots-omega { "AccessKey": { "UserName": "scrnshots-omega", "Status": "Active", "CreateDate": "2015-01-02T16:09:38.630Z", "SecretAccessKey": "vyAwcMLS0LwU0Mmy9m0war1LPiJ3xhU1SCzkpp0D", "AccessKeyId": "AKIAIUQE5XIXV4OQPKQH" } }
# aws iam create-access-key --user-name scrnshots-sigma { "AccessKey": { "UserName": "scrnshots-sigma", "Status": "Active", "CreateDate": "2015-01-02T16:09:42.854Z", "SecretAccessKey": "g4kl7ZsGSfz1jVdNKuQEJca0rYzGw3ifuzUAkOeG", "AccessKeyId": "AKIAIH7QSYK2TRKMEQJN" } }
Теперь когда у нас есть пользователи можно назначить им политику. Для этого подготавливаем текстовый файл в json формате и присоединяем политику соответствующему пользователю. Как я уже говорил в начале статьи, нам необходимо дать возможность загружать и просматривать файлы в своем бакете, но при этом у пользователя не должно быть возможности просматривать данные из чужих бакетов, а так же удалять файлы из своего бакета.
# cat ~/aws/alpha01-policy.json { "Statement": [ { "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"], "Resource": "arn:aws:s3:::*", "Effect": "Allow" }, { "Action": ["s3:ListBucket", "s3:GetBucketAcl"], "Resource": "arn:aws:s3:::*", "Effect": "Allow" }, { "Action": ["s3:Put*", "s3:Get*"], "Resource": "arn:aws:s3:::alpha01/*", "Effect": "Allow" }, { "Action": "s3:Del*", "Resource": "arn:aws:s3:::*/*", "Effect": "Deny" } ] }
При создании IAM политик для S3 следует учитывать отличие следующих объектов:
Поэтому при описании политик следует учитывать следующие моменты:
Теперь подключаем политику к пользователю
# aws iam put-user-policy --user-name scrnshots-alpha --policy-name ALPHA01-POLICY --policy-document file://~/aws/alpha01-policy.json
Если все прошло успешно, то не будет никакого вывода. Теперь проверим, что у пользователя есть политика
# aws iam list-user-policies --user-name scrnshots-alpha { "PolicyNames": [ "ALPHA01-POLICY" ] }
По аналогии подключаем политики и для 2х других пользователей
# aws iam put-user-policy --user-name scrnshots-omega --policy-name OMEGA02-POLICY --policy-document file://~/aws/omega02-policy.json
# aws iam put-user-policy --user-name scrnshots-sigma --policy-name SIGMA03-POLICY --policy-document file://~/aws/sigma03-policy.json