Join our Newsletter — 33% off our NHI Course
Home› Guides› Amazon Kinesis Security: Locking down streams, keys and…
Guide Data Security

Amazon Kinesis Security: Locking down streams, keys and producer credentials

← All guides
By NHI Mgmt Group, edited by Lalit Choda Updated 8 November 2026 14 min read
On this page

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:GenerateDataKey and consumers kms:Decrypt, and the key policy can pin use to one stream through the kms:EncryptionContext:aws:kinesis:arn condition.
  • 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.

LayerAttached toWhat it controlsPractical notes
Identity-based IAM policyProducer, consumer and admin rolesWhich kinesis: and firehose: actions a role can call, on which ARNsThe main control; one role per application and stream group
Resource-based policyA data stream or a registered (enhanced fan-out) consumerAccess for other accounts, or for principals in the same account without an identity policyNamed principals only, up to 20 KB; managed with PutResourcePolicy, GetResourcePolicy and DeleteResourcePolicy
KMS key policyThe customer managed key used for server-side encryptionWho can generate data keys (write) and decrypt (read)Producers and consumers must be allowed here or reads and writes fail
VPC endpoint policyThe Kinesis Data Streams interface endpointWhich actions and streams are reachable through that endpointGrants 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.

RoleKinesis actionsKMS actions (customer managed key)Resource scope
Data Streams producerPutRecord, PutRecords (plus DescribeStreamSummary, ListShards where the SDK needs them)kms:GenerateDataKeyOne stream ARN
Data Streams consumerGetRecords, GetShardIterator, DescribeStreamSummary, ListShardskms:DecryptOne stream ARN
Enhanced fan-out consumerDescribeStreamConsumer, SubscribeToShard on the consumer ARN; DescribeStreamSummary, ListShards on the streamkms:DecryptStream and consumer ARNs
Firehose producerfirehose:PutRecord, firehose:PutRecordBatchkms:GenerateDataKey, kms:Decrypt when the Firehose stream uses a customer managed keyOne Firehose stream ARN
Stream administratorkinesis:* on named streamskms: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 groupExample actionsWhy it mattersWho should hold it
SharingPutResourcePolicy, DeleteResourcePolicyOpens a stream or consumer to another accountPlatform team via infrastructure as code
EncryptionStartStreamEncryption, StopStreamEncryption, StartDeliveryStreamEncryption, StopDeliveryStreamEncryptionChanges the key, or removes encryption for new recordsPipeline role; alert on every Stop call
Lifecycle and retentionDeleteStream, DecreaseStreamRetentionPeriod, DeleteDeliveryStreamData loss and reduced replay window (T1485)Pipeline role only
ConsumersRegisterStreamConsumer, DeregisterStreamConsumerAdds a new reader with dedicated throughputPipeline role, reviewed against the data owner's list
Firehose destinationUpdateDestinationRedirects 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

  1. 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.
  2. 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.
  3. Where an access key already exists: scope it to PutRecord on one stream, add an aws:SourceIp or aws:SourceVpce condition, 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.

SignalSourceWhat it can indicate
PutResourcePolicy or DeleteResourcePolicy outside the pipeline roleCloudTrail management eventsUnreviewed cross-account sharing
StopStreamEncryption or StopDeliveryStreamEncryptionCloudTrail management eventsNew records written without encryption
RegisterStreamConsumer by an unexpected principalCloudTrail management eventsA new reader added to a sensitive stream
GetRecords or SubscribeToShard from an unfamiliar role, account or IPCloudTrail data eventsBulk reading of stream contents (T1530)
UpdateDestination on a Firehose streamCloudTrail management eventsDelivery redirected to a new target
KMSKeyAccessDenied, KMSKeyDisabled, KMSKeyInvalidState, KMSKeyNotFoundFirehose CloudWatch metricsKey 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 keyCloudTrail (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:* or stream/*.

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.

  1. Inventory: list every data stream, consumer and Firehose stream, with its owner, data classification, producers, consumers and destinations.
  2. 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.
  3. Pin keys to streams: in the key policy, use the kms:EncryptionContext:aws:kinesis:arn condition so a key used by one stream cannot be used to decrypt another.
  4. 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.
  5. 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:SourceVpce deny 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.
  6. Logging: enable CloudTrail data events for sensitive streams, Firehose error logging to CloudWatch Logs, and alerts for the signals in the detection table.
  7. 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.
  8. 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:Decrypt on *. 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 areaNIST SP 800-53 Rev 5ATT&CK technique addressed
Least-privilege producer and consumer rolesAC-6, AC-3T1078.004 Cloud Accounts
Roles and federation instead of stored keysIA-5T1552.001 Credentials In Files
Server-side encryption with customer managed keysSC-28, SC-12T1530 Data from Cloud Storage
VPC endpoints, endpoint policies, TLSSC-7, SC-8T1537 Transfer Data to Cloud Account
CloudTrail management and data eventsAU-2, AU-12Detection for all of the above
Retention and deletion controlsCP-9T1485 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:arn condition.
  • 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:SourceVpce deny 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

Related NHI Mgmt Group resources: Kafka Security Guide, AWS KMS Security Guide, AWS Access Keys Security Guide, Amazon MSK Security, Data Security Guide.

Free weekly newsletter

Subscribe to the NHI & AI Identity Journal

The latest on NHI and Agentic AI security – articles, research, breaches, news and events every week.

Bonus 33% off our NHI Course when you subscribe.

NHIMG Editorial Note
Researched and written by the NHI Mgmt Group editorial team using AI tools, under the editorial direction of Lalit Choda. Facts are drawn from the sources listed on this page and checked by our automated quality process. Last updated 8 November 2026. Spotted an error? Use our contact page.
NHI Mgmt Group, the independent authority on Non-Human Identity, IAM and Agentic AI security. nhimg.org