DRAFT

AI SIEM — Getting Started Guide

Version: 26h2 | Product: AI SIEM | Perfware.cloud

Prerequisites

Deploy in the same region as Log Processor. AI SIEM resolves the VPC, subnets and OpenSearch domain from Log Processor via SSM parameters, and Lambda requires its deployment package to be in the deployment region. Deploying to a different region will fail.

Step 1: Subscribe on AWS Marketplace

  1. Navigate to the AI SIEM listing on AWS Marketplace
  2. Click Continue to Subscribe
  3. Accept terms and wait for subscription activation (~2 minutes)
  4. Click Continue to Configuration
  5. Select your tier and preferred region, then Continue to Launch

Step 2: Deploy the CloudFormation Stack

On the fulfillment page, provide these parameters:

ParameterDescriptionExample
ConfirmStackNameMust match your stack name exactlyAISIEM
LogProcessorStackNameName of your deployed Log Processor stackLogProcessor
TierProduct tier (basic/essential/advanced/enterprise)advanced
AlertEmailEmail for threat notificationssecurity@company.com
EditorCertificateArnACM certificate ARNarn:aws:acm:us-east-1:...
EditorDomainCustom domain (optional)siem.company.com
CloudTrailBucketExisting 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
VpcFlowLogBucketExisting bucket your VPC Flow Logs are delivered to (optional)my-flowlogs-bucket
CrossAccountIdsAdditional account IDs (advanced+)111111111111,222222222222
Bucket parameters are optional and changeable. If you leave them empty, the stack still deploys and you set them later under Configure → Data Sources in the editor. They only take effect on first deploy — once a configuration exists, AI SIEM never overwrites it, so later changes must be made in the editor.
Deployment time: ~10–15 minutes. The stack resolves Log Processor's VPC and OpenSearch parameters via SSM, adds security group ingress, creates the SIEM-specific resources, and initializes the configuration bucket.

Step 3: Confirm SNS Subscription

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.

Step 4: Access the Editor

  1. Find the editor URL in the CloudFormation Outputs tab (or navigate to your custom domain)
  2. Log in with the Cognito credentials created by Log Processor
  3. The threat dashboard shows connected sources, active threats, and system health

Step 5: Configure Data Sources

In the editor, go to Configure → Data Sources. Sources arrive by two different mechanisms, which determines what you need to do:

S3-based sources (need a bucket)

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.

Why the notification matters: AI SIEM does not poll S3. It is told about new log files by an S3 event notification. If that notification is missing, files accumulate in your bucket and nothing is ingested, even though the bucket name is correct and the source shows as enabled.

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.

Cross-account buckets need two further grants that the helper does not yet make: the bucket policy must allow <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.

EventBridge sources (nothing to configure)

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.

Reading the health indicators

StatusMeaningAction
IngestingEvents received in the last 24 hoursNone
Enabled but no S3 bucket configuredSource is on but has nowhere to read fromEnter a bucket and save
AWS service not enabledGuardDuty, Security Hub or Config is off in this accountEnable it in that service's console
No events in 24hConfigured correctly but nothing arrivedNormal for EventBridge sources on a quiet account; for S3 sources check the bucket notification
DisabledSwitched off in configurationEnable it if wanted
Baseline learning: ML behavioural models begin learning immediately and become effective after 7–14 days of baseline data. Static detection rules fire from day one and are tunable under Configure → Detection Rules.

Step 5a: Check Everything Is Working

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:

Only high-scoring events reach OpenSearch. Every event is written to the S3 datalake for Athena queries, but only those scoring above the promotion threshold are indexed into OpenSearch for dashboards. Low OpenSearch counts alongside healthy ingestion counts is expected behaviour, not a fault.

Multi-Account Monitoring

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:

Step A — in each remote account

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:

These role names are fixed and must not be changed. AI SIEM refers to them by name, so a renamed role will not be found.

Step B — in the AI SIEM account

Registers 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.

Multi-region coverage

Remote buckets need explicit access. A bucket in another account requires its bucket policy to allow 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.

Helper Scripts

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.

Commands in this guide are written as scripts\name.cmd for clarity. If you run them from inside the unzipped folder, drop the scripts\ prefix.
ScriptRun inPurpose
check-quota.cmdAI SIEM accountVerify service quotas before deploying
setup-domainAI SIEM accountCreate the Route 53 record for a custom editor domain
wire-log-bucketEitherAttach a log bucket to ingestion when the editor cannot do it itself, including cross-account
setup-remote-accessRemote accountCreate the cross-account trust roles (Step A above)
add-accountAI SIEM accountRegister a remote account and its buckets (Step B above)
usersAI SIEM accountCognito users: create, list, delete, reset password, enable/disable
groupsAI SIEM accountCognito groups for role-based access: admin, analyst, viewer
ssoAI SIEM accountConfigure SAML or OIDC identity providers (enterprise)
support-bundleAI SIEM accountCollect diagnostics to attach to a support request
Role-based access: editor permissions come from Cognito group membership. 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.

Querying Historical Data

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';

Cost Expectations

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 volumeApproximate 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.

Fixed costs are the Editor load balancer, any interface VPC endpoints, and the OpenSearch domain provided by Log Processor, which is usually the largest single line. Verify current rates on the Amazon VPC pricing page.

Step 6: Review Threats

As threats are detected, they appear in the Threats panel with:

Updating

Troubleshooting

SymptomMost 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.

Teardown (Uninstalling)

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:

  1. Sever sources (dry run first):
    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).

  2. Delete the stack:
    aws cloudformation delete-stack --stack-name <stack>
    aws cloudformation wait stack-delete-complete --stack-name <stack>
  3. Clean OpenSearch artifacts (dashboards, index templates, ISM policy left in the shared domain):
    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.

Cross-account roles survive. 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>.

VPC Flow Logs: Cost vs Detection

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 typeDetection gainedTypical cost impact
REJECT (default)Port scanning, blocked connectionsMinimal
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.

Do not monitor the SIEM's own VPC. The LogProcessor VPC exists because OpenSearch requires it, not because it carries workload traffic worth monitoring. In a real deployment the SIEM monitors customer VPCs, not its own. Monitoring the same VPC the SIEM runs in creates an amplification loop where the SIEM's own API calls generate flow-log records that trigger more ingestion.

Support