# network-acls.tfresource"ibm_is_network_acl""web_tier_acl"{name="web-tier-acl"vpc=ibm_is_vpc.secure_vpc.id # Inbound rulesrules{name="allow-https-inbound"action="allow"direction="inbound"source="0.0.0.0/0"destination="10.240.0.0/24"tcp{port_min=443port_max=443}}rules{name="allow-http-inbound"action="allow"direction="inbound"source="0.0.0.0/0"destination="10.240.0.0/24"tcp{port_min=80port_max=80}}rules{name="allow-ssh-from-office"action="allow"direction="inbound"source="203.0.113.0/24"destination="10.240.0.0/24"tcp{port_min=22port_max=22}} # Outbound rulesrules{name="allow-all-outbound"action="allow"direction="outbound"source="10.240.0.0/24"destination="0.0.0.0/0"}}resource"ibm_is_network_acl""app_tier_acl"{name="app-tier-acl"vpc=ibm_is_vpc.secure_vpc.id # Allow inbound from web tier onlyrules{name="allow-from-web-tier"action="allow"direction="inbound"source="10.240.0.0/24"destination="10.240.1.0/24"tcp{port_min=8080port_max=8080}} # Allow outbound to data tierrules{name="allow-to-data-tier"action="allow"direction="outbound"source="10.240.1.0/24"destination="10.240.2.0/24"tcp{port_min=5432port_max=5432}} # Allow outbound HTTPS for external APIsrules{name="allow-https-outbound"action="allow"direction="outbound"source="10.240.1.0/24"destination="0.0.0.0/0"tcp{port_min=443port_max=443}}}resource"ibm_is_network_acl""data_tier_acl"{name="data-tier-acl"vpc=ibm_is_vpc.secure_vpc.id # Allow inbound from app tier onlyrules{name="allow-from-app-tier"action="allow"direction="inbound"source="10.240.1.0/24"destination="10.240.2.0/24"tcp{port_min=5432port_max=5432}} # Deny all outbound (data tier should not initiate connections)rules{name="deny-all-outbound"action="deny"direction="outbound"source="10.240.2.0/24"destination="0.0.0.0/0"}}
# Create security group for web servers
ibmcloudissecurity-group-createweb-sgmy-secure-vpc\--resource-group-nameproduction
# Allow HTTPS inbound
ibmcloudissecurity-group-rule-addweb-sginboundtcp\--port-min443--port-max443\--remote0.0.0.0/0
# Allow HTTP inbound
ibmcloudissecurity-group-rule-addweb-sginboundtcp\--port-min80--port-max80\--remote0.0.0.0/0
# Allow SSH from bastion
ibmcloudissecurity-group-rule-addweb-sginboundtcp\--port-min22--port-max22\--remote$BASTION_SG_ID# Create security group for app servers
ibmcloudissecurity-group-createapp-sgmy-secure-vpc
# Allow traffic from web tier
ibmcloudissecurity-group-rule-addapp-sginboundtcp\--port-min8080--port-max8080\--remote$WEB_SG_ID# Create security group for database
ibmcloudissecurity-group-createdb-sgmy-secure-vpc
# Allow PostgreSQL from app tier
ibmcloudissecurity-group-rule-adddb-sginboundtcp\--port-min5432--port-max5432\--remote$APP_SG_ID# List security groups
ibmcloudissecurity-groups
# List rules in security group
ibmcloudissecurity-group-rulesweb-sg
# security-groups.tfresource"ibm_is_security_group""bastion_sg"{name="bastion-sg"vpc=ibm_is_vpc.secure_vpc.id}resource"ibm_is_security_group_rule""bastion_ssh_inbound"{group=ibm_is_security_group.bastion_sg.iddirection="inbound"remote="203.0.113.0/24" # Office IP rangetcp{port_min=22port_max=22}}resource"ibm_is_security_group_rule""bastion_all_outbound"{group=ibm_is_security_group.bastion_sg.iddirection="outbound"remote="0.0.0.0/0"}resource"ibm_is_security_group""web_sg"{name="web-sg"vpc=ibm_is_vpc.secure_vpc.id}resource"ibm_is_security_group_rule""web_https_inbound"{group=ibm_is_security_group.web_sg.iddirection="inbound"remote="0.0.0.0/0"tcp{port_min=443port_max=443}}resource"ibm_is_security_group_rule""web_http_inbound"{group=ibm_is_security_group.web_sg.iddirection="inbound"remote="0.0.0.0/0"tcp{port_min=80port_max=80}}resource"ibm_is_security_group_rule""web_ssh_from_bastion"{group=ibm_is_security_group.web_sg.iddirection="inbound"remote=ibm_is_security_group.bastion_sg.idtcp{port_min=22port_max=22}}resource"ibm_is_security_group_rule""web_all_outbound"{group=ibm_is_security_group.web_sg.iddirection="outbound"remote="0.0.0.0/0"}resource"ibm_is_security_group""app_sg"{name="app-sg"vpc=ibm_is_vpc.secure_vpc.id}resource"ibm_is_security_group_rule""app_from_web"{group=ibm_is_security_group.app_sg.iddirection="inbound"remote=ibm_is_security_group.web_sg.idtcp{port_min=8080port_max=8080}}resource"ibm_is_security_group_rule""app_ssh_from_bastion"{group=ibm_is_security_group.app_sg.iddirection="inbound"remote=ibm_is_security_group.bastion_sg.idtcp{port_min=22port_max=22}}resource"ibm_is_security_group_rule""app_all_outbound"{group=ibm_is_security_group.app_sg.iddirection="outbound"remote="0.0.0.0/0"}resource"ibm_is_security_group""db_sg"{name="db-sg"vpc=ibm_is_vpc.secure_vpc.id}resource"ibm_is_security_group_rule""db_from_app"{group=ibm_is_security_group.db_sg.iddirection="inbound"remote=ibm_is_security_group.app_sg.idtcp{port_min=5432port_max=5432}}resource"ibm_is_security_group_rule""db_ssh_from_bastion"{group=ibm_is_security_group.db_sg.iddirection="inbound"remote=ibm_is_security_group.bastion_sg.idtcp{port_min=22port_max=22}}# No outbound rule for database (deny by default)
# Create Direct Link connection
ibmclouddlgateway-create\--namemy-direct-link\--typededicated\--speed-mbps1000\--bgp-asn64999\--bgp-base-cidr10.254.0.0/16\--meteredtrue\--carrier-name"Network Provider"\--customer-name"My Company"\--locationdal10
# Create virtual connection to VPC
ibmclouddlgateway-vc-create$GATEWAY_ID\--namevpc-connection\--typevpc\--network-id$VPC_CRN# List Direct Link gateways
ibmclouddlgateways
# View BGP status
ibmclouddlgateway-status$GATEWAY_ID
# Create load balancer
ibmcloudisload-balancer-createalb\--subnet$SUBNET_ID\--familyapplication\--logging-datapath-activetrue# Create backend pool
ibmcloudisload-balancer-pool-createweb-pool$LB_ID\--algorithmround_robin\--protocolhttps\--health-delay5\--health-retries2\--health-timeout2\--health-typehttps\--health-monitor-url/health\--session-persistencecookie
# Add members to pool
ibmcloudisload-balancer-pool-member-create$LB_IDweb-pool\--port443\--target$VSI_ID# Create HTTPS listener with SSL termination
ibmcloudisload-balancer-listener-create$LB_ID\--port443\--protocolhttps\--default-poolweb-pool\--certificate-instance$CERT_CRN\--connection-limit2000# Create HTTP listener (redirect to HTTPS)
ibmcloudisload-balancer-listener-create$LB_ID\--port80\--protocolhttp\--default-poolweb-pool
# Force HTTPS on load balancer# All traffic between load balancer and clients uses TLS 1.2+# Enable mutual TLS
kubectlcreatesecrettlsmtls-cert\--cert=client-cert.pem\--key=client-key.pem