
Amazon S3 के लिए एक सुरक्षा टूलकिट
Amazon S3 के लिए एक सुरक्षा टूलकिट

🍊 Instacart पर युद्ध-परीक्षित
चलाएँ:
pip install s3tk
आप अपने AWS क्रेडेंशियल्स सेट करने के लिए AWS CLI या AWS Vault का उपयोग कर सकते हैं:
pip install awscli
aws configure
प्रत्येक कमांड के लिए आवश्यक IAM नीतियाँ देखें।
अपने बकेट को स्कैन करें:
s3tk scan
केवल विशिष्ट बकेट पर चलाएँ
s3tk scan my-bucket my-bucket-2
वाइल्डकार्ड के साथ भी काम करता है
s3tk scan "my-bucket*"
सही लॉग बकेट और प्रीफिक्स की पुष्टि करें
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
अन्यथा, आप सबडोमेन टेकओवर के प्रति संवेदनशील हो सकते हैं
क्रेडेंशियल्स ~/.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/*"
]
}
]
}
S3 लॉग्स को क्वेरी करने के लिए Amazon Athena बहुत अच्छा है। एक तालिका बनाएँ और क्वेरी करें:
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
चीजों को सरल रखें और गलतियों की संभावना कम करने के लिए न्यूनतम विशेषाधिकार के सिद्धांत का पालन करें।
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