
مجموعة أدوات أمان لـ Amazon S3
مجموعة أدوات أمنية لخدمة Amazon S3

🍊 خاضعة للاختبار الميداني في Instacart
شغّل:
pip install s3tk
يمكنك استخدام AWS CLI أو AWS Vault لإعداد بيانات اعتماد AWS الخاصة بك:
pip install awscli
aws configure
انظر سياسات IAM المطلوبة لكل أمر.
افحص حاوياتك (Buckets) من أجل:
s3tk scan
تشغيل على حاويات محددة فقط
s3tk scan my-bucket my-bucket-2
يعمل أيضًا مع الأحرف البديلة (Wildcards)
s3tk scan "my-bucket*"
تأكيد صحة حاوية (أو حاويات) السجل والبادئة (Prefix)
s3tk scan --log-bucket my-s3-logs --log-bucket other-region-logs --log-prefix "{bucket}/"
فحص تسجيل مستوى الكائن في CloudTrail [تجريبي]
s3tk scan --object-level-logging
تخطي التسجيل أو التنقيح أو التشفير الافتراضي
s3tk scan --skip-logging --skip-versioning --skip-default-encryption
الحصول على إشعارات البريد الإلكتروني عند الفشل (عبر SNS)
s3tk scan --sns-topic arn:aws:sns:...
قائمة سياسات الحاويات
s3tk list-policy
تشغيل على حاويات محددة فقط
s3tk list-policy my-bucket my-bucket-2
إظهار البيانات المُسماة
s3tk list-policy --named
ملاحظة: هذا يستبدل السياسة السابقة
الرفع الخاص فقط
s3tk set-policy my-bucket --no-object-acl
حذف السياسة
s3tk delete-policy my-bucket
حظر الوصول العام على حاويات محددة
s3tk block-public-access my-bucket my-bucket-2
استخدم العلامة --dry-run للاختبار
تفعيل التسجيل على جميع الحاويات
s3tk enable-logging --log-bucket my-s3-logs
فقط على حاويات محددة
s3tk enable-logging my-bucket my-bucket-2 --log-bucket my-s3-logs
تعيين بادئة السجل ({bucket}/ بشكل افتراضي)
s3tk enable-logging --log-bucket my-s3-logs --log-prefix "logs/{bucket}/"
استخدم العلامة --dry-run للاختبار
بعض الملاحظات حول التسجيل:
تفعيل التنقيح على جميع الحاويات
s3tk enable-versioning
فقط على حاويات محددة
s3tk enable-versioning my-bucket my-bucket-2
استخدم العلامة --dry-run للاختبار
تفعيل التشفير الافتراضي على جميع الحاويات
s3tk enable-default-encryption
فقط على حاويات محددة
s3tk enable-default-encryption my-bucket my-bucket-2
هذا لا يشفر الكائنات الموجودة - استخدم الأمر encrypt لهذا الغرض
استخدم العلامة --dry-run للاختبار
فحص ACL على جميع الكائنات في حاوية
s3tk scan-object-acl my-bucket
كائنات محددة فقط
s3tk scan-object-acl my-bucket --only "*.pdf"
باستثناء كائنات معينة
s3tk scan-object-acl my-bucket --except "*.jpg"
إعادة تعيين ACL على جميع الكائنات في حاوية
s3tk reset-object-acl my-bucket
هذا يجعل جميع الكائنات خاصة. راجع سياسات الحاوية لكيفية فرض ذلك مستقبلاً.
استخدم العلامة --dry-run للاختبار
تحديد كائنات معينة بنفس طريقة scan-object-acl
تشغيل جميع الكائنات في حاوية مع التشفير من جانب الخادم
s3tk encrypt my-bucket
استخدم مفاتيح يديرها S3 بشكل افتراضي. لاستخدام مفاتيح يديرها KMS استخدم:
s3tk encrypt my-bucket --kms-key-id arn:aws:kms:...
للاستخدام مفاتيح يقدمها العميل استخدم:
s3tk encrypt my-bucket --customer-key secret-key
استخدم العلامة --dry-run للاختبار
تحديد كائنات معينة بنفس طريقة scan-object-acl
ملاحظة: ستفقد الكائنات أي ACL مخصص
حذف جميع الإصدارات غير المشفرة من الكائنات في حاوية
s3tk delete-unencrypted-versions my-bucket
للسلامة، لن يحذف هذا أي إصدارات حالية من الكائنات
استخدم العلامة --dry-run للاختبار
تحديد كائنات معينة بنفس طريقة scan-object-acl
فحص Route 53 بحثًا عن الحاويات للتأكد من ملكيتك لها
s3tk scan-dns
وإلا، فقد تكون عرضة للاستيلاء على المجالات الفرعية (subdomain takeover)
https://hackerone.com/reports/207576
يمكن تحديد بيانات الاعتماد في ~/.aws/credentials أو باستخدام متغيرات البيئة. راجع هذا الدليل لشرح متغيرات البيئة.
يمكنك تحديد ملف تعريف للاستخدام باستخدام:
AWS_PROFILE=your-profile s3tk
فيما يلي الأذونات المطلوبة لكل أمر. قم بتضمين العبارات التي تحتاجها فقط.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Scan",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:GetBucketAcl",
"s3:GetBucketPolicy",
"s3:GetBucketPublicAccessBlock",
"s3:GetBucketLogging",
"s3:GetBucketVersioning",
"s3:GetEncryptionConfiguration"
],
"Resource": "*"
},
{
"Sid": "ScanObjectLevelLogging",
"Effect": "Allow",
"Action": [
"cloudtrail:ListTrails",
"cloudtrail:GetTrail",
"cloudtrail:GetEventSelectors",
"s3:GetBucketLocation"
],
"Resource": "*"
},
{
"Sid": "ScanDNS",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"route53:ListHostedZones",
"route53:ListResourceRecordSets"
],
"Resource": "*"
},
{
"Sid": "ListPolicy",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:GetBucketPolicy"
],
"Resource": "*"
},
{
"Sid": "SetPolicy",
"Effect": "Allow",
"Action": [
"s3:PutBucketPolicy"
],
"Resource": "*"
},
{
"Sid": "DeletePolicy",
"Effect": "Allow",
"Action": [
"s3:DeleteBucketPolicy"
],
"Resource": "*"
},
{
"Sid": "BlockPublicAccess",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:PutBucketPublicAccessBlock"
],
"Resource": "*"
},
{
"Sid": "EnableLogging",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:PutBucketLogging"
],
"Resource": "*"
},
{
"Sid": "EnableVersioning",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:PutBucketVersioning"
],
"Resource": "*"
},
{
"Sid": "EnableDefaultEncryption",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:PutEncryptionConfiguration"
],
"Resource": "*"
},
{
"Sid": "ResetObjectAcl",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObjectAcl",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
},
{
"Sid": "Encrypt",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
},
{
"Sid": "DeleteUnencryptedVersions",
"Effect": "Allow",
"Action": [
"s3:ListBucketVersions",
"s3:GetObjectVersion",
"s3:DeleteObjectVersion"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
}
]
}
Amazon Athena رائعة للاستعلام عن سجلات S3. أنشئ جدولاً واستعلم:
SELECT
parse_datetime(requestdatetime, 'dd/MMM/yyyy:HH:mm:ss Z') AS time,
key,
remoteip,
useragent
FROM
s3_access_logs_db.mybucket_logs
WHERE
requester = '-'
AND httpstatus LIKE '2%'
AND key LIKE 'some-keys%'
ORDER BY 1
Amazon Athena رائعة أيضًا للاستعلام عن سجلات CloudTrail. أنشئ جدولاً واستعلم:
SELECT
eventtime,
eventname,
useridentity.username,
requestparameters
FROM
cloudtrail_logs
WHERE
eventname LIKE '%Bucket%'
ORDER BY 1
حافظ على الأمور بسيطة واتبع مبدأ الامتياز الأقل (least privilege) لتقليل فرص الأخطاء.
GetObject في سياسة الحاوية)الرفع الخاص فقط
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObjectAcl",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
للأوامر التي تتكرر على كائنات الحاوية (scan-object-acl و reset-object-acl و encrypt و delete-unencrypted-versions)، قم بتشغيل s3tk على خادم EC2 للحصول على أقل زمن انتقال.
الأوامر set-policy و block-public-access و enable-logging و enable-versioning و enable-default-encryption متوفرة للراحة. نوصي باستخدام Terraform لإدارة حاوياتك.
resource "aws_s3_bucket" "my_bucket" {
bucket = "my-bucket"
acl = "private"
logging {
target_bucket = "my-s3-logs"
target_prefix = "my-bucket/"
}
versioning {
enabled = true
}
}
resource "aws_s3_bucket_public_access_block" "my_bucket" {
bucket = "${aws_s3_bucket.my_bucket.id}"
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
شغّل:
pip install s3tk --upgrade
لاستخدام master، شغّل:
pip install git+https://github.com/ankane/s3tk.git --upgrade
شغّل:
docker run -it ankane/s3tk aws configure
احفظ بيانات اعتمادك:
docker commit $(docker ps -l -q) my-s3tk
وشغّل:
docker run -it my-s3tk s3tk scan
اطّلع على سجل التغييرات
الجميع مدعوون للمساعدة في تحسين هذا المشروع. إليك بعض الطرق التي يمكنك المساعدة بها:
للبدء في التطوير:
git clone https://github.com/ankane/s3tk.git
cd s3tk
pip install --group dev