Every record in an Amazon Kinesis stream is reachable through a signed AWS API call, so the security of a stream comes down to which roles can write, which can read, which keys protect the data and which network paths the calls travel. Kinesis Data Streams and Amazon Data Firehose carry clickstreams, application logs, telemetry and change data from production systems, often with personal or commercially sensitive content. This guide covers the customer-side controls: IAM policies for producers and consumers, resource-based policies for cross-account sharing, AWS KMS server-side encryption, interface VPC endpoints, Firehose delivery roles and destination credentials, CloudTrail logging and a hardening baseline. It is for cloud engineers, data platform teams and security reviewers. Product-neutral streaming principles are in the Kafka Security Guide; this page goes deeper on the Kinesis settings themselves.
This is an independent guide from NHI Mgmt Group, based on AWS's public documentation for Amazon Kinesis Data Streams as of November 2026. It is not sponsored or reviewed by AWS. Product features change, so confirm settings against AWS's current documentation.
Key takeaways
- Producers and consumers are non-human identities. AWS's best practice is to give them IAM roles with temporary credentials, never access keys stored in an application or an S3 bucket.
- Scope by stream ARN and by action. A producer needs PutRecord and PutRecords on its own stream; a consumer needs the Get actions and DescribeStreamSummary;
kinesis:*belongs to administrators only. - Customer managed keys give you a second gate. With a customer managed KMS key, producers also need
kms:GenerateDataKeyand consumerskms:Decrypt, and the key policy can pin use to one stream through thekms:EncryptionContext:aws:kinesis:arncondition. - Cross-account sharing needs two policies and named principals. A stream or consumer resource policy plus an identity policy in the other account, with each principal named explicitly and the stream on a customer managed key.
- Record-level calls are data events. Turn on CloudTrail data events for sensitive streams so PutRecord, GetRecords and SubscribeToShard are visible alongside the management events.
How identity and access work in Amazon Kinesis
Kinesis has no stream-level usernames or passwords. Every request is signed with AWS credentials and evaluated by IAM: the default is deny, an explicit Allow grants access and an explicit Deny overrides any Allow. Four policy layers can apply to a single call.
| Layer | Attached to | What it controls | Practical notes |
|---|---|---|---|
| Identity-based IAM policy | Producer, consumer and admin roles | Which kinesis: and firehose: actions a role can call, on which ARNs | The main control; one role per application and stream group |
| Resource-based policy | A data stream or a registered (enhanced fan-out) consumer | Access for other accounts, or for principals in the same account without an identity policy | Named principals only, up to 20 KB; managed with PutResourcePolicy, GetResourcePolicy and DeleteResourcePolicy |
| KMS key policy | The customer managed key used for server-side encryption | Who can generate data keys (write) and decrypt (read) | Producers and consumers must be allowed here or reads and writes fail |
| VPC endpoint policy | The Kinesis Data Streams interface endpoint | Which actions and streams are reachable through that endpoint | Grants nothing on its own; combine with aws:SourceVpce conditions |
Resource ARNs and actions
Streams use arn:aws:kinesis:region:account-id:stream/stream-name. Enhanced fan-out consumers have their own ARN, arn:aws:kinesis:region:account-id:stream/stream-name/consumer/consumer-name:timestamp, and need kinesis:DescribeStreamConsumer and kinesis:SubscribeToShard on that consumer ARN. Firehose streams use arn:aws:firehose:region:account-id:deliverystream/name, and producers need only firehose:PutRecord and firehose:PutRecordBatch.
| Role | Kinesis actions | KMS actions (customer managed key) | Resource scope |
|---|---|---|---|
| Data Streams producer | PutRecord, PutRecords (plus DescribeStreamSummary, ListShards where the SDK needs them) | kms:GenerateDataKey | One stream ARN |
| Data Streams consumer | GetRecords, GetShardIterator, DescribeStreamSummary, ListShards | kms:Decrypt | One stream ARN |
| Enhanced fan-out consumer | DescribeStreamConsumer, SubscribeToShard on the consumer ARN; DescribeStreamSummary, ListShards on the stream | kms:Decrypt | Stream and consumer ARNs |
| Firehose producer | firehose:PutRecord, firehose:PutRecordBatch | kms:GenerateDataKey, kms:Decrypt when the Firehose stream uses a customer managed key | One Firehose stream ARN |
| Stream administrator | kinesis:* on named streams | kms:List*, kms:DescribeKey* | Restrict the all-streams form (stream/*) to administrators |
Applications built on the Kinesis Client Library also need DynamoDB permissions for the lease table and CloudWatch permissions for metrics. Scope those to the application's own lease table rather than granting DynamoDB broadly. For general policy design, see the AWS IAM Policies and Roles Guide.
Admin roles and privileged access
The privileged actions in Kinesis are the ones that change who can reach a stream, how it is encrypted and how long data is kept. Treat them as change-controlled operations owned by a deployment pipeline.
| Permission group | Example actions | Why it matters | Who should hold it |
|---|---|---|---|
| Sharing | PutResourcePolicy, DeleteResourcePolicy | Opens a stream or consumer to another account | Platform team via infrastructure as code |
| Encryption | StartStreamEncryption, StopStreamEncryption, StartDeliveryStreamEncryption, StopDeliveryStreamEncryption | Changes the key, or removes encryption for new records | Pipeline role; alert on every Stop call |
| Lifecycle and retention | DeleteStream, DecreaseStreamRetentionPeriod, DeleteDeliveryStream | Data loss and reduced replay window (T1485) | Pipeline role only |
| Consumers | RegisterStreamConsumer, DeregisterStreamConsumer | Adds a new reader with dedicated throughput | Pipeline role, reviewed against the data owner's list |
| Firehose destination | UpdateDestination | Redirects delivered data to a different bucket, cluster or endpoint (T1537) | Pipeline role only; never a producer |
- Human access through short sessions: engineers who need to read production records should assume a time-bound read role through IAM Identity Center, with data events logged. See the AWS IAM Identity Center Guide.
- Organisation guardrails: an SCP can deny StopStreamEncryption, DeleteResourcePolicy changes and UpdateDestination to everything except the pipeline role, and RCPs can keep streams inside your organisation. See the AWS Resource Control Policies and Data Perimeter Guide.
- Key administrators are separate from key users: the people who manage the KMS key policy should not also hold read access to the stream. See the AWS KMS Security Guide.
Integrations, API tokens and service accounts
Most Kinesis traffic comes from machines: application servers, containers, Lambda functions, IoT rules, Managed Service for Apache Flink applications and Firehose itself. Each one is a non-human identity that needs its own credential path.
Producer credentials
- Inside AWS: use the compute service's role (EC2 instance profile, ECS task role, EKS pod identity or IRSA, Lambda execution role). The SDK picks up temporary credentials automatically.
- Outside AWS: use IAM Roles Anywhere with X.509 certificates, or web identity federation for workloads that already hold OIDC tokens, instead of long-term access keys. See the AWS IAM Roles Anywhere Security Guide.
- Where an access key already exists: scope it to PutRecord on one stream, add an
aws:SourceIporaws:SourceVpcecondition, rotate it and plan its retirement. See How to rotate an AWS IAM access key without downtime.
AWS's guidance is explicit that long-term credentials should not be stored in a client application or in an S3 bucket, because they are not rotated automatically. Static keys in producer code are a classic route to T1552.001 credential theft and then T1078.004 use of cloud accounts.
Cross-account producers and consumers
To share a stream, attach a resource policy that names the external role and lists only the shareable actions it needs: PutRecord, PutRecords, GetRecords, GetShardIterator, ListShards and DescribeStreamSummary on the stream, plus DescribeStreamConsumer and SubscribeToShard on a consumer. The external account must also grant those actions in an identity policy. Resource policies take named principals; AWS service principals, federated principals and wildcards are outside their scope, so use an IAM role in the partner account. If the stream uses the AWS managed key aws/kinesis, switch it to a customer managed key before sharing and allow the external principals in the key policy. For cross-account writes, use the AWS SDK with the stream ARN; AWS notes that the Kinesis Producer Library uses stream names for this case. Review the trust with How to review AWS cross-account trust policies.
Managed consumers
Lambda event source mappings and Managed Service for Apache Flink read through their own execution roles, so those roles need the consumer actions and, with a customer managed key, kms:Decrypt. Keep one role per function or application so a change to one consumer does not widen access for the others. See the AWS Lambda Security Guide.
Firehose delivery roles and destination secrets
Firehose assumes an IAM role, trusted by the firehose.amazonaws.com service principal, to read from a Kinesis source, invoke a transformation Lambda, write CloudWatch error logs and deliver to S3, OpenSearch or other targets. Give each Firehose stream its own delivery role, scoped to its source stream, its bucket and prefix, and its log group. For S3 with a customer managed key, AWS's example policy limits kms:Decrypt and kms:GenerateDataKey with kms:ViaService and kms:EncryptionContext:aws:s3:arn conditions.
Some destinations authenticate with their own credentials rather than IAM: a Redshift user name and password, a Splunk HTTP Event Collector token, or an API key for a third-party HTTP endpoint. Firehose can retrieve these from AWS Secrets Manager at runtime, which keeps them out of plain text in the console and API parameters and lets Firehose handle rotation. Use that option for every destination credential. See the AWS Secrets Manager Guide. For OpenSearch or OpenSearch Serverless in a VPC, the delivery role needs EC2 network interface permissions; AWS warns not to revoke them after the stream is created, or delivery stops.
Logging and detection
Kinesis Data Streams integrates with AWS CloudTrail, which records the caller, source IP address, time and request details. Management operations such as CreateStream, StartStreamEncryption, PutResourcePolicy and RegisterStreamConsumer appear as management events. Record-level calls are data events, logged only when you add data event selectors for the resource types AWS::Kinesis::Stream and AWS::Kinesis::StreamConsumer. Data events are billed separately, so enable them on streams that carry sensitive data first. See the AWS CloudTrail Guide.
| Signal | Source | What it can indicate |
|---|---|---|
| PutResourcePolicy or DeleteResourcePolicy outside the pipeline role | CloudTrail management events | Unreviewed cross-account sharing |
| StopStreamEncryption or StopDeliveryStreamEncryption | CloudTrail management events | New records written without encryption |
| RegisterStreamConsumer by an unexpected principal | CloudTrail management events | A new reader added to a sensitive stream |
| GetRecords or SubscribeToShard from an unfamiliar role, account or IP | CloudTrail data events | Bulk reading of stream contents (T1530) |
| UpdateDestination on a Firehose stream | CloudTrail management events | Delivery redirected to a new target |
| KMSKeyAccessDenied, KMSKeyDisabled, KMSKeyInvalidState, KMSKeyNotFound | Firehose CloudWatch metrics | Key policy or key state change that will stop delivery; Firehose retains undecryptable records for up to 24 hours before discarding them |
| Decrypt or GenerateDataKey denials on the stream key | CloudTrail (KMS) | A producer or consumer missing from the key policy, or a role probing for access |
AWS Security Hub CSPM includes Kinesis.1 (streams should be encrypted at rest), Kinesis.2 (streams should be tagged) and Kinesis.3 (streams should have an adequate data retention period). See the AWS Security Hub Guide.
Metrics that show the controls are working
- Encryption coverage: percentage of streams passing Kinesis.1, and percentage of sensitive streams on a customer managed key.
- Credential type: number of producers using long-term access keys, trending to zero.
- Sharing inventory: number of streams with resource policies, each with a named owner and review date.
- Data event coverage: percentage of sensitive streams with CloudTrail data events enabled.
- Wildcard grants: count of non-admin roles holding
kinesis:*orstream/*.
Hardening baseline
The sequence below is NHI Mgmt Group guidance, not a vendor requirement; adjust it to your environment.
Apply this baseline stream by stream, starting with the streams that carry personal data, credentials in logs or payment events. Test in a non-production account first: tightened key policies are the change most likely to break producers.
- Inventory: list every data stream, consumer and Firehose stream, with its owner, data classification, producers, consumers and destinations.
- Encrypt at rest: enable server-side encryption on each data stream. Encryption applies to records written after it is enabled, so turn it on at creation (or drain and recreate streams where older records matter). Use a customer managed key for sensitive or shared streams. For Firehose with Direct PUT or other sources, enable SSE with StartDeliveryStreamEncryption or at creation; with a Kinesis data stream as source, encrypt the data stream. Firehose supports symmetric customer managed keys.
- Pin keys to streams: in the key policy, use the
kms:EncryptionContext:aws:kinesis:arncondition so a key used by one stream cannot be used to decrypt another. - Rewrite roles: one role per producer and consumer, actions limited to the tables above, resources limited to stream and consumer ARNs. Move KCL lease table access to the application's own table.
- Private network path: create interface VPC endpoints for Kinesis Data Streams (and Firehose where producers run in VPCs), attach endpoint policies that list the allowed streams, and add
aws:SourceVpcedeny conditions for streams that should only be reached privately. FIPS-enabled interface endpoints are available in US Regions where FIPS 140 validated modules are required. - Logging: enable CloudTrail data events for sensitive streams, Firehose error logging to CloudWatch Logs, and alerts for the signals in the detection table.
- Retention: set retention to what replay and recovery actually need; longer retention keeps more data exposed to any reader. Use Kinesis.3 as the floor.
- Destination credentials: move every Firehose destination password, token or API key into Secrets Manager.
Rollback: key policy and IAM changes take effect quickly and can be reverted by redeploying the previous policy version from source control. Keep the previous version ready and watch the KMS denial metrics for the first hour after each change. For small teams with a handful of streams, the AWS managed key and tightly scoped roles are a reasonable start; large organisations sharing streams across accounts need customer managed keys, resource policies under change control and organisation-level guardrails.
Common misconfigurations
- Access keys in producer code or config: long-term keys copied into mobile apps, edge devices or S3. Replace them with roles, Roles Anywhere or federation, and see How to find unused AWS IAM roles and access keys.
- Producers with read rights: using
kinesis:*or AWS managed broad policies for applications that only write. Split producer and consumer roles. - Encryption turned on after the data: enabling SSE on a stream that already holds records leaves earlier records as they were until they age out of retention.
- Key policy drift: a new consumer is added in IAM but not in the KMS key policy, reads fail and someone "fixes" it by granting
kms:Decrypton*. Use encryption context conditions and keep key policies in code. - Shared delivery roles: one Firehose role used by many streams, so every stream can write to every bucket. Give each stream its own role and prefix.
- Destination credentials in plain configuration: HEC tokens or database passwords entered directly instead of through Secrets Manager.
Framework mapping
| Control area | NIST SP 800-53 Rev 5 | ATT&CK technique addressed |
|---|---|---|
| Least-privilege producer and consumer roles | AC-6, AC-3 | T1078.004 Cloud Accounts |
| Roles and federation instead of stored keys | IA-5 | T1552.001 Credentials In Files |
| Server-side encryption with customer managed keys | SC-28, SC-12 | T1530 Data from Cloud Storage |
| VPC endpoints, endpoint policies, TLS | SC-7, SC-8 | T1537 Transfer Data to Cloud Account |
| CloudTrail management and data events | AU-2, AU-12 | Detection for all of the above |
| Retention and deletion controls | CP-9 | T1485 Data Destruction |
Practitioner checklist
- Every Kinesis and Firehose producer uses an IAM role or federated credential, not a stored access key.
- Producer, consumer and admin roles are separate and scoped to named stream, consumer and Firehose ARNs.
- Server-side encryption is on for every data stream and Direct PUT Firehose stream, with customer managed keys for sensitive or shared streams.
- Key policies name the producer and consumer roles and use the
kms:EncryptionContext:aws:kinesis:arncondition. - Resource policies name each external role, list only the actions needed, and have an owner and review date.
- Interface VPC endpoints with endpoint policies serve producers and consumers inside VPCs; private-only streams carry
aws:SourceVpcedeny conditions. - Each Firehose stream has its own delivery role, and destination credentials live in Secrets Manager.
- CloudTrail data events are enabled for sensitive streams, with alerts on encryption, sharing and destination changes.
- Security Hub controls Kinesis.1 and Kinesis.3 pass across all accounts.
Standards and references
- AWS: Security best practices for Kinesis Data Streams
- AWS: Controlling access to Amazon Kinesis Data Streams resources using IAM
- AWS: Permissions to use user-generated KMS keys
- AWS: Using Kinesis Data Streams with interface VPC endpoints
- AWS: Controlling access with Amazon Data Firehose
- AWS: Data protection in Amazon Data Firehose
- AWS: Security Hub controls for Kinesis
- NIST: SP 800-53 Rev. 5 Security and Privacy Controls
Related NHI Mgmt Group resources: Kafka Security Guide, AWS KMS Security Guide, AWS Access Keys Security Guide, Amazon MSK Security, Data Security Guide.