seahaven-org-baseline/lib/view-access-stack.ts
Adam Moussa 5589c6d34c
Some checks are pending
Deploy / deploy-management (push) Waiting to run
Deploy / deploy-external-dev (push) Waiting to run
Deploy / deploy-security (push) Waiting to run
Deploy / deploy-dev (push) Waiting to run
Deploy / deploy-prod (push) Waiting to run
feat(iam): add view-only access across all five accounts (PLAT-237) (#176)
Give the view group ViewOnlyAccess in every account without a data-plane read or an assume-role path, and include the stack on the management deploy job.
2026-10-02 18:25:22 +00:00

96 lines
2.7 KiB
TypeScript

import * as cdk from "aws-cdk-lib";
import * as identitystore from "aws-cdk-lib/aws-identitystore";
import * as sso from "aws-cdk-lib/aws-sso";
import { Construct } from "constructs";
const IDENTITY_CENTER_INSTANCE_ARN =
"arn:aws:sso:::instance/ssoins-722321f42ca610e4";
const IDENTITY_STORE_ID = "d-9067ec8e26";
const VIEW_ONLY_POLICY = "arn:aws:iam::aws:policy/job-function/ViewOnlyAccess";
export interface ViewAccessStackProps extends cdk.StackProps {
managementAccountId: string;
securityAccountId: string;
externalDevAccountId: string;
devAccountId: string;
prodAccountId: string;
}
/**
* Identity Center group and permission set for view-only access across
* every organization account.
*
* ViewOnlyAccess lists and describes resources. It does not read S3
* objects, secret values, DynamoDB items, or log contents. There is no
* inline policy and no sts:AssumeRole on OrganizationAccountAccessRole.
*
* Group membership is outside this stack.
*/
export class ViewAccessStack extends cdk.Stack {
constructor(scope: Construct, id: string, props: ViewAccessStackProps) {
super(scope, id, props);
const group = new identitystore.CfnGroup(this, "ViewGroup", {
identityStoreId: IDENTITY_STORE_ID,
displayName: "view",
description:
"View-only across all organization accounts. No data-plane reads.",
});
const permissionSet = new sso.CfnPermissionSet(this, "ViewPermissionSet", {
instanceArn: IDENTITY_CENTER_INSTANCE_ARN,
name: "View",
description:
"ViewOnlyAccess in every organization account. No assume-role.",
sessionDuration: "PT8H",
managedPolicies: [VIEW_ONLY_POLICY],
});
this.assignment(
"ViewManagementAssignment",
permissionSet,
group,
props.managementAccountId,
);
this.assignment(
"ViewSecurityAssignment",
permissionSet,
group,
props.securityAccountId,
);
this.assignment(
"ViewExternalDevAssignment",
permissionSet,
group,
props.externalDevAccountId,
);
this.assignment(
"ViewDevAssignment",
permissionSet,
group,
props.devAccountId,
);
this.assignment(
"ViewProdAssignment",
permissionSet,
group,
props.prodAccountId,
);
}
private assignment(
id: string,
permissionSet: sso.CfnPermissionSet,
group: identitystore.CfnGroup,
targetId: string,
): void {
new sso.CfnAssignment(this, id, {
instanceArn: IDENTITY_CENTER_INSTANCE_ARN,
permissionSetArn: permissionSet.attrPermissionSetArn,
principalId: group.attrGroupId,
principalType: "GROUP",
targetId,
targetType: "AWS_ACCOUNT",
});
}
}