Version: 26h2 | Product: AI SIEM | Perfware.cloud
aws cloudtrail describe-trailsOn the fulfillment page, provide these parameters:
| Parameter | Description | Example |
|---|---|---|
| ConfirmStackName | Must match your stack name exactly | AISIEM |
| LogProcessorStackName | Name of your deployed Log Processor stack | LogProcessor |
| Tier | Product tier (basic/essential/advanced/enterprise) | advanced |
| AlertEmail | Email for threat notifications | security@company.com |
| EditorCertificateArn | ACM certificate ARN | arn:aws:acm:us-east-1:... |
| EditorDomain | Custom domain (optional) | siem.company.com |
| CloudTrailBucket | Existing bucket your CloudTrail logs are delivered to. Leave empty to set it later in the editor. This does not create a trail. | my-cloudtrail-bucket |
| VpcFlowLogBucket | Existing bucket your VPC Flow Logs are delivered to (optional) | my-flowlogs-bucket |
| CrossAccountIds | Additional account IDs (advanced+) | 111111111111,222222222222 |
Check the email address(es) provided in AlertEmail. Click the confirmation link in the AWS SNS email. Threat alerts will not be delivered until confirmed.
In the editor, go to Configure → Data Sources. Sources arrive by two different mechanisms, which determines what you need to do:
CloudTrail and VPC Flow Logs are read from S3. Enter the
bucket that already receives those logs and click Save Sources. AI SIEM
then configures an s3:ObjectCreated notification on that bucket pointing at
its ingestion queue, and reports the result per bucket.
If saving reports that the bucket could not be configured, it is almost always because the bucket belongs to a different AWS account — common for an organization trail in a log archive account. Run the supplied helper from a machine with credentials for both accounts:
scripts\wire-log-bucket.cmd <stack> <bucket> <region> <bucket-profile> # same account scripts\wire-log-bucket.cmd AISIEM my-cloudtrail-logs # bucket owned by a log archive account scripts\wire-log-bucket.cmd AISIEM org-trail-logs us-east-1 logarchive
It adds the notification and grants that account permission to send to the ingestion
queue. Both changes are merge-safe: existing notifications on the bucket are preserved,
and re-running is harmless. Add --dry-run via
wire_log_bucket.py to preview changes before touching a shared bucket.
<stack>-IngestionRole to
s3:GetObject, and if the bucket is SSE-KMS encrypted, the key policy must allow
that role to kms:Decrypt. Without them, notifications arrive and every file read
fails. Contact support if you need help applying these.
GuardDuty, Security Hub and AWS Config are delivered by EventBridge rules the stack creates. There is no bucket and no setup. They only produce data when something happens, so zero events is normal on a quiet account.
These only work if the underlying AWS service is enabled. AI SIEM checks this for you and the panel will say AWS service not enabled rather than leaving you guessing. To verify yourself:
aws guardduty list-detectors aws securityhub describe-hub aws configservice describe-config-rules --query "ConfigRules[].ConfigRuleName"
Empty results mean the service is off and those rules will never fire. Enabling GuardDuty is the highest-value one; it begins producing findings on its own within a few hours.
| Status | Meaning | Action |
|---|---|---|
| Ingesting | Events received in the last 24 hours | None |
| Enabled but no S3 bucket configured | Source is on but has nowhere to read from | Enter a bucket and save |
| AWS service not enabled | GuardDuty, Security Hub or Config is off in this account | Enable it in that service's console |
| No events in 24h | Configured correctly but nothing arrived | Normal for EventBridge sources on a quiet account; for S3 sources check the bucket notification |
| Disabled | Switched off in configuration | Enable it if wanted |
Open FAQ in the editor. Every answer is a live check against the real dependency rather than a configuration readback, so it reflects what your deployment can actually do:
AI SIEM is deployed once, in one account, and reads security data from any number of other accounts using cross-account IAM roles. Available on advanced tier and above.
There are two steps, run in two different accounts and in this order:
Creates the trust roles AI SIEM assumes. Run with credentials for the account you want to monitor, passing the account ID of the account where AI SIEM is deployed:
scripts\setup-remote-access.cmd setup <central-account-id>
This creates two roles:
AISIEM-remote-read — read CloudTrail and VPC Flow Log objects from S3AISIEM-remote-respond — remediation actions, enterprise tier onlyRegisters the remote account and the bucket to read from, so ingestion begins:
scripts\add-account.cmd <stack> <remote-account-id> --trail-bucket <bucket>
You can also list the account IDs in the CrossAccountIds stack parameter, or set
OrganizationId to authorise an entire AWS Organization. Either may be used, or both.
AISIEM-IngestionRole to s3:GetObject, and if SSE-KMS
encrypted, its key policy to allow kms:Decrypt. It also needs the notification wiring
described in Step 5. Contact support if you need help with these.
Download the helper scripts
(aisiem-scripts.zip). Unzip anywhere and run from that folder. Windows
.cmd and Linux/macOS .sh versions are provided for most; a few use
Python and need boto3 (pip install boto3). Run them with AWS
credentials for the account named in the table below.
scripts\name.cmd for clarity. If you run them
from inside the unzipped folder, drop the scripts\ prefix.
| Script | Run in | Purpose |
|---|---|---|
check-quota.cmd | AI SIEM account | Verify service quotas before deploying |
setup-domain | AI SIEM account | Create the Route 53 record for a custom editor domain |
wire-log-bucket | Either | Attach a log bucket to ingestion when the editor cannot do it itself, including cross-account |
setup-remote-access | Remote account | Create the cross-account trust roles (Step A above) |
add-account | AI SIEM account | Register a remote account and its buckets (Step B above) |
users | AI SIEM account | Cognito users: create, list, delete, reset password, enable/disable |
groups | AI SIEM account | Cognito groups for role-based access: admin, analyst, viewer |
sso | AI SIEM account | Configure SAML or OIDC identity providers (enterprise) |
support-bundle | AI SIEM account | Collect diagnostics to attach to a support request |
admin can change configuration and approve remediation, analyst can
investigate and update threats, viewer is read-only. Run
groups.cmd init once to create them, then assign users with
groups.cmd add <user> <group>. Users in no group default to admin, so create
the groups before granting access more widely.
Every event is written to an S3 datalake in Parquet, partitioned for efficient Athena queries, regardless of whether it was promoted to OpenSearch. Use this for investigations reaching further back than the OpenSearch retention window:
s3://<stack>-siem-datalake-<account>-<region>/
cloudtrail/account_id=.../region=.../year=.../month=.../day=.../*.parquet
flowlogs/account_id=.../region=.../year=.../month=.../day=.../*.parquet
guardduty/ securityhub/ config-changes/ threats/
A Glue database named <stack>_siem is created with tables over these prefixes.
Filter on the partition columns so Athena scans only what it needs:
SELECT * FROM cloudtrail WHERE account_id = '111111111111' AND region = 'us-east-1' AND year = '2026' AND month = '08';
AI SIEM's own resources are modest and mostly usage-based. The variable cost that surprises people is VPC Flow Logs, billed by AWS at roughly $0.25/GB delivered to S3 plus S3 storage, independent of AI SIEM:
| Flow log volume | Approximate AWS cost |
|---|---|
| 1 GB/day | ~$8/month |
| 10 GB/day | ~$75/month |
| 100 GB/day | ~$750/month |
A busy production VPC logging ALL traffic reaches tens of GB per day without
difficulty. Setting the flow log traffic type to REJECT typically reduces volume by
an order of magnitude and still supports port scanning and blocked-connection detection. CloudTrail
management events are far smaller and rarely material.
As threats are detected, they appear in the Threats panel with:
| Symptom | Most likely cause |
|---|---|
| A source shows Enabled but no S3 bucket configured | Enter the bucket under Configure → Data Sources and save. |
| Bucket is set, files are in it, but no events arrive | The bucket has no s3:ObjectCreated notification to the ingestion queue.
Save again in Data Sources, and if that reports a failure run
scripts\wire-log-bucket.cmd. Verify with
aws s3api get-bucket-notification-configuration --bucket <name>. |
| GuardDuty, Security Hub or Config show no events | Normal on a quiet account. If the panel says AWS service not enabled, that service is off in your account and its rule can never fire. |
| No threat alert emails | The SNS subscription is unconfirmed. The FAQ panel lists pending subscribers. Unconfirmed addresses receive nothing and produce no error. |
| Playbook generation fails | Check the FAQ Bedrock row. Access denied usually means model access is not granted or the Anthropic use case form has not been submitted in the Bedrock console. |
| Editor shows an authentication error after login | If you use a custom domain, it must be set in the EditorDomain
parameter, not only in DNS, so the hostname is registered as a valid Cognito callback. |
| Ingestion counts look healthy but dashboards are empty | Expected. Only events above the promotion threshold are indexed into OpenSearch; everything else is queryable in the S3 datalake via Athena. |
When contacting support, include the Version line from the FAQ panel — it identifies your stack, tier, release and build.
Deleting the CloudFormation stack does not detach the data sources that feed it. Bucket notifications and any VPC Flow Logs created for AI SIEM live outside CloudFormation and survive the delete. Left in place, notifications fire at a queue that no longer exists, and flow logs keep writing to S3 while you continue paying for storage.
Run teardown in this order:
python scripts\sever_sources.py <stack> python scripts\sever_sources.py <stack> --apply
Deletes VPC flow logs, removes this stack's bucket notifications (merge-safe: other
tools' notifications are preserved), and stops the CloudTrail trail. Each action is
confirmed individually. Add --delete-trail to delete rather than stop the
trail. Add --delete-buckets to also destroy the log buckets AI SIEM created
(irreversible — requires typing each bucket name to confirm).
aws cloudformation delete-stack --stack-name <stack> aws cloudformation wait stack-delete-complete --stack-name <stack>
python scripts\clean_opensearch.py --print-commands
Prints paste-ready steps for the Dashboards UI and Dev Tools console, since the domain is VPC-only and not reachable from a workstation. Future deployments clean these up automatically on stack delete.
AISIEM-remote-read and
AISIEM-remote-respond in each remote account remain. Remove them in those accounts
with scripts\setup-remote-access.cmd remove <central-account-id>.
Flow-log volume is the single largest cost variable. The default traffic type is
REJECT, which supports port-scan detection and costs roughly 1–5% of what
ALL traffic would. Switching to ALL adds large-transfer exfiltration
detection but can raise Lambda and DynamoDB costs significantly at scale.
| Traffic type | Detection gained | Typical cost impact |
|---|---|---|
REJECT (default) | Port scanning, blocked connections | Minimal |
ALL | + Large data exfiltration (>10MB) | 20–50x more Lambda duration |
When ALL is enabled, AI SIEM's ingestion filter automatically drops routine noise
before scoring: internal VPC-to-VPC ACCEPT traffic, ACCEPT on safe ports (443, 80, 53) to private
destinations, and broken records. Only REJECT flows, large transfers, and ACCEPT to external
addresses on unusual ports reach the detection pipeline.