Mengumpulkan log AWS IAM
Dokumen ini menjelaskan cara menyerap log AWS IAM ke Google Security Operations. Parser mengubah log berformat JSON mentah menjadi Unified Data Model (UDM) terstruktur. Alat ini mengekstrak kolom yang relevan seperti detail pengguna, informasi peran, izin, dan stempel waktu, serta memetakan kolom tersebut ke kolom UDM yang sesuai untuk analisis keamanan yang konsisten.
Sebelum memulai
- Pastikan Anda memiliki instance Google Chronicle.
- Pastikan Anda memiliki akses dengan hak istimewa ke AWS.
Mengonfigurasi AWS IAM dan S3
- Buat bucket Amazon S3 dengan mengikuti panduan pengguna ini: Membuat bucket.
- Simpan Nama dan Region bucket untuk digunakan nanti.
- Buat pengguna dengan mengikuti panduan pengguna ini: Membuat pengguna IAM.
- Pilih Pengguna yang dibuat.
- Pilih tab Kredensial keamanan.
- Klik Create Access Key di bagian Access Keys.
- Pilih Layanan pihak ketiga sebagai Kasus penggunaan.
- Klik Next.
- Opsional: tambahkan tag deskripsi.
- Klik Create access key.
- Klik Download file CSV untuk menyimpan Kunci Akses dan Kunci Akses Rahasia untuk digunakan nanti.
- Klik Done.
- Pilih tab Izin.
- Klik Tambahkan izin di bagian Kebijakan izin.
- Pilih Tambahkan izin.
- Pilih Lampirkan kebijakan secara langsung
- Telusuri dan pilih kebijakan AmazonS3FullAccess.
- Klik Next.
- Klik Tambahkan izin.
Mengonfigurasi CloudTrail untuk merekam log IAM
- Login ke AWS Management Console.
- Di kotak penelusuran, ketik dan pilih CloudTrail dari daftar layanan.
- Klik Buat jalur.
- Berikan Trail name; misalnya,
IAMActivityTrail
.- Terapkan uji coba ke semua wilayah: pilih Ya untuk merekam aktivitas di semua wilayah.
- Lokasi penyimpanan: pilih bucket S3 yang dibuat sebelumnya atau buat bucket baru.
- Bucket S3: masukkan nama untuk bucket S3; misalnya,
iam-logs-bucket
. - Pilih Buat peran IAM baru (jika belum dibuat sebelumnya).
- Peristiwa pengelolaan: pilih Baca dan Tulis untuk merekam peristiwa baca dan tulis pada resource IAM.
- Peristiwa data: aktifkan peristiwa data S3 dan Lambda.
- Klik Create untuk membuat rekaman aktivitas.
Mengonfigurasi CloudTrail untuk Mengekspor Log ke S3
- Buka Layanan > S3.
- Pilih bucket S3 tempat log CloudTrail disimpan; misalnya,
iam-logs-bucket
. - Pastikan CloudTrail memiliki izin yang tepat untuk menulis log ke bucket.
Tambahkan kebijakan berikut jika belum ada:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "CloudTrailS3Access", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::your-bucket-name/AWSLogs/*" } ] }
Aktifkan Pembuatan Versi di bucket S3 untuk memastikan log disimpan dengan beberapa versi.
Buka Properties > Bucket Versioning > Enable.
Opsional: Mengonfigurasi Lambda untuk ekspor real-time
- Buka Konsol Lambda AWS.
- Klik Create function.
- Pilih Author from Scratch.
- Tetapkan nama fungsi sebagai
ExportIAMLogsToS3
. - Pilih runtime Python 3.x.
Tetapkan Peran IAM ke fungsi yang memiliki izin untuk:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:GetLogEvents", "logs:FilterLogEvents", "logs:DescribeLogGroups", "logs:DescribeLogStreams" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::your-bucket-name/*" } ] }
Gunakan kode Python berikut untuk mengambil log IAM dan menguploadnya ke S3:
import boto3 import gzip from io import BytesIO s3 = boto3.client('s3') logs = boto3.client('logs') def lambda_handler(event, context): log_group = event['logGroup'] log_stream = event['logStream'] log_events = logs.get_log_events( logGroupName=log_group, logStreamName=log_stream, startFromHead=True ) log_data = "\n".join([event['message'] for event in log_events['events']]) # Compress and upload to S3 compressed_data = gzip.compress(log_data.encode('utf-8')) s3.put_object( Bucket='your-s3-bucket-name', Key='iam-logs/{log_stream}.gz', Body=compressed_data )
- Ganti
your-s3-bucket-name
dengan nama bucket Anda yang sebenarnya.
Mengonfigurasi Pemicu Lambda untuk CloudWatch Logs
- Di Lambda Console, buka Designer.
- Pilih Tambahkan Pemicu > CloudWatch Logs.
- Pilih grup log CloudWatch Logs yang terkait dengan log IAM Anda; misalnya,
/aws/cloudtrail/
. - Klik Tambahkan.
Mengonfigurasi feed di Google SecOps untuk menyerap log AWS IAM
- Buka Setelan SIEM > Feed.
- Klik Tambahkan baru.
- Di kolom Nama feed, masukkan nama untuk feed; misalnya, AWS IAM Logs.
- Pilih Amazon S3 sebagai Source type.
- Pilih AWS IAM sebagai Jenis log.
- Klik Next.
Tentukan nilai untuk parameter input berikut:
- Region: region tempat bucket Amazon S3 berada.
- S3 URI: URI bucket.
s3://your-log-bucket-name/
- Ganti
your-log-bucket-name
dengan nama bucket yang sebenarnya.
- Ganti
- URI adalah: pilih Direktori atau Direktori yang menyertakan subdirektori.
Opsi penghapusan sumber: pilih opsi penghapusan sesuai preferensi Anda.
Access Key ID: Kunci akses pengguna dengan akses ke bucket s3.
Kunci Akses Rahasia: kunci rahasia Pengguna dengan akses ke bucket s3.
Namespace aset: namespace aset.
Label penyerapan: label yang akan diterapkan ke peristiwa dari feed ini.
Klik Next.
Tinjau konfigurasi feed baru Anda di layar Finalize, lalu klik Submit.
Tabel Pemetaan UDM
Kolom Log | Pemetaan UDM | Logika |
---|---|---|
Arn | entity.entity.resource.name | Dipetakan langsung dari kolom Arn untuk jenis entity USER dan RESOURCE. Untuk jenis entity GROUP, jenis ini dipetakan dari Group.Arn . |
AssumeRolePolicyDocument | entity.entity.resource.attribute.permissions.name | Dipetakan langsung dari kolom AssumeRolePolicyDocument , tetapi hanya untuk jenis entity RESOURCE. |
CreateDate | entity.entity.user.attribute.creation_time | Dipetakan langsung dari kolom CreateDate dan dikonversi ke format stempel waktu Chronicle untuk jenis entitas PENGGUNA. |
CreateDate | entity.entity.resource.attribute.creation_time | Dipetakan langsung dari kolom CreateDate dan dikonversi ke format stempel waktu Chronicle untuk jenis entity RESOURCE. |
Group.Arn | entity.entity.resource.name | Dipetakan langsung dari kolom Group.Arn untuk jenis entitas GROUP. |
Group.CreateDate | entity.entity.group.attribute.creation_time | Dipetakan langsung dari kolom Group.CreateDate dan dikonversi ke format stempel waktu Chronicle. |
Group.GroupID | entity.entity.group.product_object_id | Dipetakan langsung dari kolom Group.GroupID . |
Group.GroupName | entity.entity.group.group_display_name | Dipetakan langsung dari kolom Group.GroupName . |
Group.GroupName | entity.entity.group.email_addresses | Dipetakan langsung dari kolom Group.GroupName . |
Group.Path | entity.entity.group.attribute.labels.value | Dipetakan langsung dari kolom Group.Path , kunci di-hardcode menjadi path |
IsTruncated | entity.entity.group.attribute.labels.value | Dipetakan langsung dari kolom IsTruncated dan dikonversi menjadi string, kunci di-hardcode menjadi is_truncated |
Penanda | entity.entity.group.attribute.labels.value | Dipetakan langsung dari kolom Marker , kunci di-hardcode menjadi marker |
PasswordLastUsed | entity.entity.user.last_login_time | Dipetakan langsung dari kolom PasswordLastUsed dan dikonversi ke format stempel waktu Chronicle. |
Jalur | entity.entity.user.attribute.labels.value | Dipetakan langsung dari kolom Path untuk jenis entity USER, kunci di-hardcode ke path . |
Jalur | entity.entity.resource.attribute.labels.value | Dipetakan langsung dari kolom Path untuk jenis entity RESOURCE, kunci di-hardcode ke path . |
PermissionsBoundary.PermissionsBoundaryArn | entity.entity.resource.attribute.labels.value | Dipetakan langsung dari kolom PermissionsBoundary.PermissionsBoundaryArn , kunci di-hardcode menjadi permissions_boundary_arn . |
PermissionsBoundary.PermissionsBoundaryType | entity.entity.resource.attribute.labels.value | Dipetakan langsung dari kolom PermissionsBoundary.PermissionsBoundaryType , kunci di-hardcode menjadi permissions_boundary_type . |
RoleID | entity.entity.resource.product_object_id | Dipetakan langsung dari kolom RoleID . |
RoleLastUsed.LastUsedDate | entity.entity.resource.attribute.labels.value | Dipetakan langsung dari kolom RoleLastUsed.LastUsedDate , kunci di-hardcode menjadi role_last_used_date . |
RoleLastUsed.Region | entity.entity.location.name | Dipetakan langsung dari kolom RoleLastUsed.Region . |
RoleName | entity.entity.resource.attribute.roles.name | Dipetakan langsung dari kolom RoleName . |
Tags.Key | entity.entity.user.attribute.labels.key | Digunakan sebagai kunci untuk kolom labels dalam atribut pengguna. |
Tags.Value | entity.entity.user.attribute.labels.value | Digunakan sebagai nilai untuk kolom labels dalam atribut pengguna. |
UserID | entity.entity.user.product_object_id | Dipetakan langsung dari kolom UserID . |
NamaPengguna | entity.entity.user.userid | Dipetakan langsung dari kolom UserName . |
Users.Arn | relations.entity.resource.name | Dipetakan langsung dari kolom Users.Arn dalam hubungan pengguna. |
Users.CreateDate | relations.entity.user.attribute.creation_time | Dipetakan langsung dari kolom Users.CreateDate dalam hubungan pengguna dan dikonversi ke format stempel waktu Chronicle. |
Users.PasswordLastUsed | relations.entity.user.last_login_time | Dipetakan langsung dari kolom Users.PasswordLastUsed dalam hubungan pengguna dan dikonversi ke format stempel waktu Chronicle. |
Users.Path | relations.entity.user.attribute.labels.value | Dipetakan langsung dari kolom Users.Path dalam hubungan pengguna, kunci di-hardcode ke path . |
Users.PermissionsBoundary.PermissionsBoundaryArn | relations.entity.resource.attribute.labels.value | Dipetakan langsung dari kolom Users.PermissionsBoundary.PermissionsBoundaryArn dalam hubungan pengguna, kunci di-hardcode ke permissions_boundary_arn . |
Users.PermissionsBoundary.PermissionsBoundaryType | relations.entity.resource.attribute.labels.value | Dipetakan langsung dari kolom Users.PermissionsBoundary.PermissionsBoundaryType dalam hubungan pengguna, kunci di-hardcode ke permissions_boundary_type . |
Users.UserID | relations.entity.user.product_object_id | Dipetakan langsung dari kolom Users.UserID dalam hubungan pengguna. |
Users.UserName | relations.entity.user.userid | Dipetakan langsung dari kolom Users.UserName dalam hubungan pengguna. |
T/A | entity.metadata.collected_timestamp | Diisi dengan stempel waktu peristiwa dari log mentah. |
T/A | entity.metadata.vendor_name | Di-hardcode ke AWS . |
T/A | entity.metadata.product_name | Di-hardcode ke AWS IAM . |
T/A | entity.metadata.entity_type | Ditentukan berdasarkan keberadaan kolom tertentu: PENGGUNA jika UserID ada, RESOURCE jika RoleName ada, dan GRUP jika Group.GroupName ada. |
T/A | entity.entity.resource.resource_subtype | Tetapkan ke User untuk jenis entity USER dan GROUP. |
T/A | entity.entity.resource.resource_type | Tetapkan ke ACCESS_POLICY untuk jenis entity RESOURCE. |
T/A | entity.entity.resource.attribute.cloud.environment | Di-hardcode ke AMAZON_WEB_SERVICES . |
T/A | relations.entity_type | Di-hardcode ke USER untuk hubungan pengguna dalam grup. |
T/A | relations.relationship | Di-hardcode ke MEMBER untuk hubungan pengguna dalam grup. |
T/A | relations.direction | Di-hardcode ke UNIDIRECTIONAL untuk hubungan pengguna dalam grup. |
T/A | relations.entity.resource.resource_subtype | Di-hardcode ke User untuk hubungan pengguna dalam grup. |
Perubahan
2023-12-14
- Parser yang baru dibuat.
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.