察象èªè : AWSãããããè§Šã人ãEC2ãšããååããç¥ããªããŠæ§ããŸããã AWSå匷ã·ãªãŒãºã®5æ¬ç®ã§ããå šäœã®å°å³ã¯çŽ¢åŒèšäºã«ãããŸããååã§EC2ãã®ãã®ã説æããŠãåŸåã¯æš©éã«çµããŸãããµãŒããŒã1å°ç«ãŠããšãã誰ãå ¥ããŠããã®ãµãŒããŒèªèº«ã¯äœãè§ŠããŠã誰ãèµ·åãã¿ã³ãæŒããã®ããEC2ã§åå¿è ãæåã«èžãã®ã¯ãã ããããã®2ã€ã§ãã
- ãµãŒããŒãäœã£ãã®ã«ãSSHã§å ¥ããªã
- EC2ã®äžã®ããã°ã©ã ãããS3ã®ãã¡ã€ã«ãèªããªã
èŠãç®ã¯ã©ã¡ãããç¹ãããªããã§ãããåå ã¯å¥ç©ã§ããåè ã¯å ¥å£ã®èšå®ãåŸè ã¯ãµãŒããŒèªèº«ã®æš©éãããŒããéããŠãåŸè ã¯çŽããŸããããã®èšäºãèªã¿çµãããšããã®2ã€ãåãåããããŠãã»ãã¥ãªãã£ã°ã«ãŒãã«äœãæžãã°ããããæ±ºããããããã«ãªããŸãã
EC2ãšã¯äœã
Amazon Elastic Compute Cloud(EC2)ã¯ãAWSã®äžã«ã³ã³ãã¥ãŒã¿ãŒã1å°åããŠãèªåã®ããã°ã©ã ãåããç¶ãããµãŒãã¹ã§ããåãã1å°ãã€ã³ã¹ã¿ã³ã¹ãšåŒã³ãŸãã
èªåã®ããŒãPCãšã®éãã¯ãå®ç©ãæå ã«ç¡ãããšã ãã§ããOS(LinuxãWindows)ãå ¥ã£ãŠããŠãSSHã§ãã°ã€ã³ã§ãã奜ããªãœãããå ¥ããŠãããã°ã©ã ãåžžæåãããŸããéãã®ã¯ãæ°åã§äœããŠãèŠããªããªã£ããæ¶ããŠãåãããæéã ããéãæãç¹ã§ãã
ãElastic(䌞瞮ãã)ãã®ååã©ãããæ§èœã¯ããšããå€ããããŸããæåã¯äžçªå°ãããµã€ãºã§äœããè¶³ããªããã°æ¢ããŠå€§ãããµã€ãºã«å€ããŠèµ·åãçŽããŸããç©çãµãŒããŒãè²·ãã®ãšéã£ãŠãéžæãééããŠãåŸã§çŽããŸãã
äœã«äœ¿ãã
- Webãµã€ãã»Webã¢ããªãåãã: äžçªå€ãçšéã§ããApache/Nginxãå ¥ããŠãã©ãŠã¶ããã¢ã¯ã»ã¹ããã
- ãããåŠçã»å®æå®è¡: æ¯æ©CSVãéèšãããããŒã¿ã倿ãããšãã£ããåžžé§ãé·æéã®åŠç
- éçºçšã»æ€èšŒçšã®ãµãŒããŒ: ãèªåã®PCã§ã¯åãã®ã«æ¬çªã§åããªããã確ãããå Žæ
- ä»ã®ãµãŒãã¹ã®æäœå : EC2ã®äžã®ããã°ã©ã ããS3ã«ãã¡ã€ã«ã眮ããSQSããã¡ãã»ãŒãžãåã
è£ãè¿ããšãçæéã§çµããåŠçãªãLambdaãã³ã³ããåæãªãECSãFargateã®æ¹ãåããŸããEC2ãéžã¶åºæºã¯ãOSãŸã§èªåã§è§Šãããããããã»ã¹ãåžžé§ãããããã®2ã€ã§ãã
EC2ãšS3ã»SQSã®éã
ãã®ã·ãªãŒãºã§è§Šã£ãŠãããµãŒãã¹ãšæ¯ã¹ããšãEC2ã ã圹å²ãéããŸãã
| äœããããã®ã | ããªããæžããã³ãŒã㯠| |
|---|---|---|
| S3 | ãã¡ã€ã«ã®çœ®ãå Ž | åããªã(眮ãã ã) |
| SQS / SNS | ã¡ãã»ãŒãžã®åãæž¡ã | åããªã(æž¡ãã ã) |
| EC2 | ã³ã³ãã¥ãŒã¿ãŒãã®ãã® | ããã§åã |
S3ãSQSããããªãã®ã³ãŒããå€ããåŒã¶çžæãã§ãããEC2ã¯ããªãã®ã³ãŒããäœãå Žæã§ãããããä»ã®ãµãŒãã¹ãåŒã¶åŽã«ãªããŸããã ããæš©éã®è©±ãæ¥ã«å¢ããŸããã誰ããã®ãµãŒããŒã«å ¥ããããããã®ãµãŒããŒã¯äœãè§Šã£ãŠãããããšããã眮ãå ŽãµãŒãã¹ã«ã¯ç¡ãã£ãåããåºãŠããããã§ãã
ä»AWSã®å°å³ã®ã©ãã«ããã
ãã®ã·ãªãŒãºã§è§Šã£ãŠãããã®ãšãä»åã®äœçœ®ã§ãã
IAM(誰ãäœãããŠããã)ã1æ¬ç®ã«ãã£ãã®ã¯ããã®åã®ããã§ããããŸããEC2ã®æš©éã¯ããã®IAMã®ç¥èã3æ¹åã«äœ¿ãåãã話ã«ãªããŸãã
ä»ã¯ããã ãåããã°OK
EC2ã®èšäºãèªããšVPCããµãããããAMIãEBSãENIãELBâŠãšçšèªãéªåŽ©ããŠããŸããæš©éã®è©±ããããªããèŠããã®ã¯3ã€ã ãã§ãã
| çšèª | æå³ | ã²ãšããšã§ |
|---|---|---|
| ã»ãã¥ãªãã£ã°ã«ãŒã(SG) | ã€ã³ã¹ã¿ã³ã¹ã«ä»ããéä¿¡ã®èš±å¯ãªã¹ã | å€ãã誰ãå ¥ããã |
| ããŒã㢠| SSHã§ãã°ã€ã³ããããã®éµãå ¬ééµããµãŒããŒã«å ¥ã | å ¥ããšãã®éµ |
| IAMããŒã«(ã€ã³ã¹ã¿ã³ã¹ãããã¡ã€ã«) | ã€ã³ã¹ã¿ã³ã¹èªèº«ã«æãããæš©é | ãµãŒããŒãäœãè§Šããã |
åŸåãã§ããèª: VPCã»ãµãããã(SGã®å€åŽã®ãããã¯ãŒã¯èšå®)ãEBS(ãã£ã¹ã¯)ãAMI(OSã®å)ãENI(ä»®æ³LANã«ãŒã)ãæåã®1å°ãç«ãŠãã ããªãæ¢å®ã®ãŸãŸã§åããŸãã
æš©éã¯3æ¹åãã
EC2ã®æš©éãåããã«ããã®ã¯ãçš®é¡ã®éã3ã€ãåæã«åºãŠããããã§ããåé ã®çµµããã®3ã€ã§ããªãã£ã¹ã®éšå±ã«äŸãããšãããªããŸãã
- éšå±ã®åã«ç«ã€èŠåå¡ãã誰ãéããã®ãªã¹ããæã£ãŠãã = ã»ãã¥ãªãã£ã°ã«ãŒã
- éšå±ã®éµãæã£ãŠãã人ã ããäžã«å ¥ãã = ããŒãã¢
- éšå±ã®äžã®äººãéŠããäžãã瀟å¡èšŒããããšãè³æå®€ã«å ¥ãã = IAMããŒã«
- ããããéšå±ãåããŠããããæ±ºããã®ããã«ã®ç®¡ç人 = IAMããªã·ãŒ
ãã®4ã€ããæ¹åã§æŽçãçŽããŸãã
- å€ â ãµãŒããŒ: 誰ããã®ãµãŒããŒã«æ¥ç¶ã§ããããæ åœã¯ã»ãã¥ãªãã£ã°ã«ãŒããšããŒãã¢
- ãµãŒã㌠â AWS: ãã®ãµãŒããŒã®äžã®ããã°ã©ã ãS3ãSQSãè§Šããããæ åœã¯IAMããŒã«
- 人 â AWS: ãããã誰ããã®ã€ã³ã¹ã¿ã³ã¹ãèµ·åã»åæ¢ã»åé€ã§ããããæ åœã¯IAMããªã·ãŒ(ååã®IAMèšäºã®è©±)
åå¿è ããããã®ã¯ãããŠã1ãš2ã®åãéãã§ãããEC2ããS3ãèªããªããã1(SG)ã®åé¡ã ãšæã£ãŠå šããŒããéããããšããäºæ ãèµ·ããŸããå®éã¯2(ããŒã«)ã®åé¡ã§ãã
ãã®ã³ãŒããåããåæ
ãã®èšäºã®ã³ãŒãã¯Python(boto3)ã§ããåããæ¹æ³ã¯2éããããŸãã
A. AWSã¢ã«ãŠã³ãç¡ãã§è©Šã(ãããã): motoãšããAWSã®ãã£ããããã䜿ããšã課éããµã€ã³ã¢ããããªãã§PCã®äžã ãã§åããŸãã
python3 -m venv venv
./venv/bin/pip install boto3 moto
from moto import mock_aws
@mock_aws # ãã®äžã®boto3åŒã³åºãã¯å
šéšããŒã«ã«ã®åœAWSã«è¡ã
def main() -> None:
... # 以äžã®èšäºã®ã³ãŒããããã«å
¥ãã
main()
B. æ¬ç©ã®AWSã§åãã: å
ã«IAMãŠãŒã¶ãŒãšã¢ã¯ã»ã¹ããŒãäœã£ãŠ aws configure ã§ç»é²ããŠããå¿
èŠããããŸããæé ã¯IAMã®èšäºã«ãããŸããEC2ã¯èµ·åãããšèª²éãå§ãŸãã®ã§ã詊ããã terminate_instances ã§å¿
ãæ¶ããŠãã ããã
äœ¿ãæ¹ã3ã€ãä»ããŠãµãŒããŒãç«ãŠã
ããããšã¯4ã€ã§ããéšå±ãåããŠãèŠåå¡ãç«ãŠãŠãéµãäœã£ãŠã瀟å¡èšŒãæž¡ãããã®é çªã§çµã¿ç«ãŠãŸãã
äžã®4ã³ãããã®ãŸãŸã³ãŒãã®é çªã«ãªããŸããPython(boto3)ã§æžããšæ¬¡ã®ãšããã§ããmotoã§AWSã¢ã«ãŠã³ãç¡ãã«å®è¡ããŠããŸãã
import json
import os
import boto3
ec2 = boto3.client("ec2", region_name="ap-northeast-1")
iam = boto3.client("iam")
# æ¢å®VPCãåæãã§åã(å
é ãåããšå¥ã®VPCãæŽãããšããã)
vpc_id = ec2.describe_vpcs(Filters=[{"Name": "isDefault", "Values": ["true"]}]
)["Vpcs"][0]["VpcId"]
# OSã®å(AMI)ãææ°ã®Amazon Linux 2023ã®IDã¯å
¬åŒã®SSMãã©ã¡ãŒã¿ããåãã®ã確å®
ssm = boto3.client("ssm", region_name="ap-northeast-1")
ami_id = ssm.get_parameter(
Name="/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64")["Parameter"]["Value"]
# â å€âãµãŒããŒ: ã»ãã¥ãªãã£ã°ã«ãŒã
sg = ec2.create_security_group(GroupName="web-sg", Description="web server",
VpcId=vpc_id)["GroupId"]
ec2.authorize_security_group_ingress(GroupId=sg, IpPermissions=[
# HTTP(80çª)ã¯å
šäžçã«éãã
{"IpProtocol": "tcp", "FromPort": 80, "ToPort": 80,
"IpRanges": [{"CidrIp": "0.0.0.0/0"}]},
# SSH(22çª)ã¯èªåã®IPã ãã/32 ã¯ããã®IP1ã€ã ããã®æå³
{"IpProtocol": "tcp", "FromPort": 22, "ToPort": 22,
"IpRanges": [{"CidrIp": "203.0.113.10/32"}]},
])
# â¡ å
¥ããšãã®éµ: ããŒãã¢ãç§å¯éµã¯ãã®1åããåãåããªã
kp = ec2.create_key_pair(KeyName="my-key")
with open("my-key.pem", "w") as f:
f.write(kp["KeyMaterial"])
os.chmod("my-key.pem", 0o400) # æš©éãç·©ããšsshãéµãæåŠãã
ãµãŒããŒèªèº«ã®æš©éã¯ãIAMããŒã«ãäœã£ãŠã€ã³ã¹ã¿ã³ã¹ãããã¡ã€ã«ãšããå ¥ãç©ã«å ¥ããŠããæž¡ããŸããEC2ã«ããŒã«ãçŽæ¥ã¯æž¡ããããã®å ¥ãç©ãèŠãããšããã®ãEC2ç¹æã®äžæéã§ãã
# ⢠ãµãŒããŒâAWS: EC2ãåŒãåããããããŒã«ãäœã
trust = {"Version": "2012-10-17", "Statement": [{
"Effect": "Allow",
"Principal": {"Service": "ec2.amazonaws.com"}, # åŒãåããŠããã®ã¯EC2
"Action": "sts:AssumeRole"}]}
iam.create_role(RoleName="ec2-s3-reader",
AssumeRolePolicyDocument=json.dumps(trust))
# 察象ã¯çµããListBucketã¯ãã±ãããGetObjectã¯ãã®äžèº«ãšãæå®å
ãéã
pol = {"Version": "2012-10-17", "Statement": [
{"Effect": "Allow", "Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::my-bucket"},
{"Effect": "Allow", "Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"}]}
arn = iam.create_policy(PolicyName="S3ReadOnly",
PolicyDocument=json.dumps(pol))["Policy"]["Arn"]
iam.attach_role_policy(RoleName="ec2-s3-reader", PolicyArn=arn)
# ããŒã«ãã€ã³ã¹ã¿ã³ã¹ãããã¡ã€ã«ã«å
¥ãã(EC2ã¯ãã®åœ¢ã§ããåãåããªã)
iam.create_instance_profile(InstanceProfileName="ec2-s3-reader")
iam.add_role_to_instance_profile(InstanceProfileName="ec2-s3-reader",
RoleName="ec2-s3-reader")
# ⣠3ã€ãæž¡ããŠèµ·å
r = ec2.run_instances(
ImageId=ami_id, InstanceType="t3.micro", MinCount=1, MaxCount=1,
KeyName="my-key", # éµ
SecurityGroupIds=[sg], # å
¥å£
IamInstanceProfile={"Name": "ec2-s3-reader"}, # ãµãŒããŒã®æš©é
MetadataOptions={"HttpTokens": "required"}, # IMDSv2ãå¿
é ã«ãã(åŸè¿°)
)
å®è¡çµæã§ãã
SG rules: [(80, '0.0.0.0/0'), (22, '203.0.113.10/32')]
keypair: my-key ç§å¯éµã®å
é : -----BEGIN RSA PRIVATE KEY-
instance: i-1801bd63d60fa4836 running t3.micro
key: my-key | sg: ['web-sg'] | profile: ec2-s3-reader | IMDSv2: required
ä»ããªããäœã£ããã®
ã€ã³ã¹ã¿ã³ã¹ã running ã«ãªããŸãããæå
ã®PCãšæ¯ã¹ããšãããããç¶æ
ã§ãã
| èªåã®PC | ä»äœã£ãEC2 | |
|---|---|---|
| 黿º | èªåã§å ¥ãã |
run_instances ã§å
¥ã£ããæ¢ãããŸã§èª²éãç¶ã |
| ãã°ã€ã³ | ãã¹ã¯ãŒã |
my-key.pem(éµãã¡ã€ã«)ãç¡ãããšSSHã§ã¯å
¥ããªã(SSM Session Managerçã®å¥çµè·¯ã¯ãã) |
| å€ããå ¥ããã | åºæ¬å ¥ããªã | SGã§èš±å¯ãã80çªãš22çªã ãå ¥ãã |
| ä»ã®ãµãŒãã¹ãè§Šãæš©é | èªåã®ã¢ã«ãŠã³ã | ã€ã³ã¹ã¿ã³ã¹ãããã¡ã€ã«çµç±ãã¢ã¯ã»ã¹ããŒã¯çœ®ããŠããªã |
ã¢ã¯ã»ã¹ããŒããµãŒããŒã«çœ®ããªãã®ãä»åãã¡ã°ã倧äºãªç¹ã§ããããŒã«ãä»ããã€ã³ã¹ã¿ã³ã¹ã®äžã§ã¯ãAWS SDKãèªåã§äžæçãªèªèšŒæ
å ±ãåã£ãŠããŸããã³ãŒãã«éµãæžãå¿
èŠãã~/.aws/credentials ã眮ãå¿
èŠããããŸããã
ãã®äžæèªèšŒæ
å ±ã®ååŸå£ã**ã€ã³ã¹ã¿ã³ã¹ã¡ã¿ããŒã¿(IMDS)**ã§ããããã§ MetadataOptions={"HttpTokens": "required"} ãæå®ããŸãããããã¯IMDSv2å¿
é ãšããèšå®ã§ããv1ã䜿ããç¶æ
ã ãšãã¢ããªã®è匱æ§ãèžãã ãšãã«å€éšããèªèšŒæ
å ±ãæãããçµè·¯ãæ®ããŸããæ°ããAMIãã¢ã«ãŠã³ãèšå®ã§æ¢å®ãv2å¿
é ã«ãªã£ãŠããããšããããŸãããèµ·åæã«æç€ºããŠããã®ã確å®ã§ãã
1ãæã ãå€ããŠã¿ã
SSHã®èš±å¯ç¯å²ã 203.0.113.10/32(èªåã®IPã ã)ãã 0.0.0.0/0(å
šäžç)ã«å€ãããšãèšå®ã¯ããèŠããŸãã
ec2.authorize_security_group_ingress(GroupId=sg, IpPermissions=[
{"IpProtocol": "tcp", "FromPort": 22, "ToPort": 22,
"IpRanges": [{"CidrIp": "0.0.0.0/0"}]}])
port 80 from 0.0.0.0/0
port 22 from 203.0.113.10/32
port 22 from 0.0.0.0/0 <- å±éº
å€ãèš±å¯ã¯æ¶ãããäž¡æ¹ãæ®ããŸãã ã»ãã¥ãªãã£ã°ã«ãŒãã¯ãèš±å¯ã®è¶³ãç®ããªã®ã§ãåºãæ¹ãå®è³ªã®èšå®ã«ãªããŸããç¯å²ãçããããšãã¯è¿œå ã§ã¯ãªã revoke_security_group_ingress ã§å€ãè¡ãæ¶ããŠãã ããã22çªãå
šäžçã«éãããšç·åœãããã°ã€ã³ãæ¥ãŸããæ°ã«ãªããªããµãŒããŒã® /var/log/secure ã§ Failed password ã®è¡ãæ°ããŠã¿ãŠãã ããã
äœã£ãçŽåŸã®ã°ã«ãŒãã®äžèº«ãèŠãŠãããŸãã
äœã£ãçŽåŸã®ingress(å
åã): []
äœã£ãçŽåŸã®egress(å€åã): [('-1', ['0.0.0.0/0'])]
å
åãã¯ç©º(誰ãå
¥ããªã)ãå€åãã¯å
šèš±å¯ã§ããããã§ãããäœã£ãã°ãããã¯èªåã§ create_security_group ããSGã®è©±ã§ãVPCã«æåãããã default ãšããååã®SGã¯å¥ç©ã§ãããã¡ãã¯ãåãdefault SGãä»ãããªãœãŒã¹å士ã¯éãããšããå
åãã«ãŒã«ãæåãã1æ¬æã£ãŠããŸãããäœã£ãã°ããã®ãµãŒããŒã«ç¹ãããªããã¯ããããŠãSGã®å
åãã空ãªã ãã§ããéã«å€åãã¯æ¢å®ã§éããŠããã®ã§ããµãŒããŒããã®apt/yumãAPIåŒã³åºãã¯æåããéããŸã(æ¢å®VPCã®ããã«ã€ã³ã¿ãŒããããžã®åºå£ãããå Žåã®è©±ã§ã)ã
èžã¿å°ãµãŒããŒçµç±ã«ããããšãã¯ãIPã§ã¯ãªãã°ã«ãŒããæå®ã§ããŸãã
ec2.authorize_security_group_ingress(GroupId=sg, IpPermissions=[
{"IpProtocol": "tcp", "FromPort": 22, "ToPort": 22,
"UserIdGroupPairs": [{"GroupId": bastion_sg}]}]) # èžã¿å°SGããã ãèš±å¯
èžã¿å°ã®IPãå€ãã£ãŠãçŽãå¿ èŠããªããªããŸãã
ã»ãã¥ãªãã£ã°ã«ãŒãã«ã¯çµå±ãäœãæžãã®ã
ãããäžçªè¿·ããŸããäœã£ãçŽåŸã®ã»ãã¥ãªãã£ã°ã«ãŒããäœãæã£ãŠããããå®éã«èŠãŠã¿ãŸãã
sg = ec2.create_security_group(GroupName="web-sg", Description="web", VpcId=vpc)["GroupId"]
d = ec2.describe_security_groups(GroupIds=[sg])["SecurityGroups"][0]
print("å
¥ãæ¹å:", d["IpPermissions"])
print("åºãæ¹å:", d["IpPermissionsEgress"])
å
¥ãæ¹å: []
åºãæ¹å: [{'IpProtocol': '-1', 'IpRanges': [{'CidrIp': '0.0.0.0/0'}], ...}]
å ¥ãæ¹åã¯ç©ºã£ãœãåºãæ¹åã¯æåããå šéæŸã§ããã€ãŸãäœãããŠã®ãµãŒããŒã¯ã誰ãå ¥ããªãããäžããã¯ã©ããžã§ãåºããããç¶æ ããå§ãŸããŸãã
ã ããæ®æ®µæžãã®ã¯å ¥ãæ¹åã ãã§ããåºãæ¹åã¯æ¢å®ã®ãŸãŸè§ŠããŸãã(ãµãŒããŒãOSã®æŽæ°ãAWSã®APIãåŒã¶ã®ã«äœ¿ãã®ã§ãéãããšéã«å°ããŸã)ã
æ»ãã®éä¿¡ã®èšå®ã¯èŠããªã
åå¿è ãæåã«æ··ä¹±ããã®ãããã§ããã80çªãéãããã©ããµãŒããŒãè¿äºãéãè¿ãåã®èš±å¯ãèŠãã®ã§ã¯?ããšèããŠããŸããŸãã
èŠããŸãããã»ãã¥ãªãã£ã°ã«ãŒãã¯è¡ããèš±å¯ããã°ããã®æ»ãã¯èªåã§éããŸã(ã¹ããŒããã«ããšããæ§è³ªã§ã)ã80çªã1è¡æžãã°ãé²èЧè ããã®ãªã¯ãšã¹ããããµãŒããŒããã®å¿çãäž¡æ¹éããŸãã
äœçªãéããã
çšéããšã«æ±ºãŸã£ãŠããŸããèªåãããããããšã®è¡ã ãéããã°ååã§ãã
| ããããããš | ããŒã | ãœãŒã¹(誰ãã) |
|---|---|---|
| Webãµã€ããå ¬éãã | 80 |
0.0.0.0/0(å
šäžç) |
| Webãµã€ããHTTPSã§å ¬éãã | 443 |
0.0.0.0/0(å
šäžç) |
| SSHã§ãã°ã€ã³ããŠäœæ¥ãã | 22 | èªåã®IPã ã |
| Windowsã«RDPã§å ¥ã | 3389 | èªåã®IPã ã |
| å¥ã®ãµãŒããŒããMySQLã䜿ã | 3306 | çžæã®ã»ãã¥ãªãã£ã°ã«ãŒã |
| å¥ã®ãµãŒããŒããPostgreSQLã䜿ã | 5432 | çžæã®ã»ãã¥ãªãã£ã°ã«ãŒã |
倪åã®è¡ã 0.0.0.0/0 ã«ããªãã§ãã ããã22çªãå
šäžçã«éãããšãæ°åã§äžçäžãããã°ã€ã³è©Šè¡ãæ¥ãŸãã
ãœãŒã¹ã®3ã€ã®æžãæ¹
ã誰ãããã®æ¬ã«ã¯3çš®é¡ã®æžãæ¹ããããŸãã
| æžãæ¹ | æå³ | 䜿ãå Žé¢ |
|---|---|---|
0.0.0.0/0 |
å šäžçã®ã©ãããã§ã | å ¬éããWebãµã€ãã®80çªã»443çª |
203.0.113.10/32 |
ãã®IPã¢ãã¬ã¹1ã€ã ã | èªåã®å®¶ãäŒç€Ÿããã®SSH |
sg-0abc123... |
ãã®ã»ãã¥ãªãã£ã°ã«ãŒããä»ããæ©åšãã | WebãµãŒã㌠â DBãµãŒã㌠|
3ã€ç®ãå®åã§äžçªäœ¿ããŸããçžæã®IPã¢ãã¬ã¹ã調ã¹ãå¿ èŠããªãããµãŒããŒãå¢ãããŠãèšå®ãçŽããªããŠæžãããã§ãã
ãã®ãŸãŸäœ¿ãã3ãã¿ãŒã³
â å ¬éããWebãµãŒããŒ
ec2.authorize_security_group_ingress(GroupId=web_sg, IpPermissions=[
{"IpProtocol": "tcp", "FromPort": 80, "ToPort": 80,
"IpRanges": [{"CidrIp": "0.0.0.0/0"}]},
{"IpProtocol": "tcp", "FromPort": 443, "ToPort": 443,
"IpRanges": [{"CidrIp": "0.0.0.0/0"}]},
{"IpProtocol": "tcp", "FromPort": 22, "ToPort": 22,
"IpRanges": [{"CidrIp": "203.0.113.10/32"}]}, # èªåã®IPã«çœ®ãæãã
])
â¡ èªåãã䜿ããªãæ€èšŒçšãµãŒããŒ
ec2.authorize_security_group_ingress(GroupId=dev_sg, IpPermissions=[
{"IpProtocol": "tcp", "FromPort": 22, "ToPort": 22,
"IpRanges": [{"CidrIp": "203.0.113.10/32"}]},
])
22çªãèªåã®IPã ããããã§è¶³ããŸãã
⢠WebãµãŒããŒãšããŒã¿ããŒã¹ã®2å°æ§æ
ããŒã¿ããŒã¹åŽã«ã¯ãIPã¢ãã¬ã¹ã§ã¯ãªãWebãµãŒããŒã®ã»ãã¥ãªãã£ã°ã«ãŒããæžããŸãã
ec2.authorize_security_group_ingress(GroupId=db_sg, IpPermissions=[
{"IpProtocol": "tcp", "FromPort": 3306, "ToPort": 3306,
"UserIdGroupPairs": [{"GroupId": web_sg}]}, # IPã§ã¯ãªãSGãæå®
])
å®è¡ããŠäžèº«ãèŠããšãIPã®æ¬ã¯ç©ºã§ãåç §å ã®SGã ããå ¥ã£ãŠããŸãã
3306çª â SG ['sg-ef89609e7367de7c6'] IPæå®=[]
ããæžããŠãããšãWebãµãŒããŒã2å°3å°ãšå¢ãããŠãããã®ãµãŒããŒã« web_sg ãä»ããã ãã§DBã«ç¹ãããŸããDBåŽã®èšå®ã¯å€ããŸããã
ã»ãã¥ãªãã£ã°ã«ãŒãã§è©°ãŸããšãã
å®éã«å©ããŠç¢ºãããæåã§ãã
åãã«ãŒã«ãããäžåºŠè¿œå
â InvalidPermission.Duplicate - The specified rule already exists
ããã®IPã¯æåŠããšæžããã
â æžããªããAPIã«æåŠã®æå®ãç¡ããèš±å¯ã ãã䞊ã¹ãä»çµã¿
IpProtocol="-1" ãæå®
â å
šãããã³ã«ã»å
šããŒããéããæå³ã«ãªããç¯å²ãçµããã«äœ¿ããªã
1å°ã®ãµãŒããŒã«2ã€ã®SGãä»ãã
â ä»ããSG: ['web-sg', 'db-sg'] è€æ°ä»ããããèš±å¯ã¯åç®ããã
æåŠãæžããªãã®ããåã®ç¯ã§èŠããèš±å¯ã®è¶³ãç®ãã®çç±ã§ããçããããšãã¯è¿œå ã§ã¯ãªãåé€(revoke_security_group_ingress)ã䜿ããŸãã
ãªããããã§æ±ã£ãã®ã¯ã€ã³ã¹ã¿ã³ã¹ã«ä»ããéä¿¡ã®èš±å¯ã ãã§ãããµããããåäœã§æåŠãæžããä»çµã¿(ãããã¯ãŒã¯ACL)ãããããããããã¯ãŒã¯ãã©ãåºåããã¯ã次å: ãå³è§£ãAWS VPCãšã¯ã5ã€ã®éšåãšãå€ããç¹ãããªãåå ãå šéšãŸãšãã
å®éã«å©ããšæ¢ãŸããšãã
æš©éãŸããã§è¿ããšã©ãŒãmotoã§åçŸããŸããããšã©ãŒã³ãŒãã¯æ¬ç©ã®EC2ãšåãã§ãã
ç¡ãSGãæå®ããŠèµ·å -> InvalidGroup.NotFound
ååã®SGãããäžåºŠäœã -> InvalidGroup.Duplicate
åãèš±å¯ãäºéã«è¿œå -> InvalidPermission.Duplicate
ã€ã³ã¹ã¿ã³ã¹ã忢 -> stopped
ã€ã³ã¹ã¿ã³ã¹ãçµäº -> terminated
stopped ãš terminated ã¯å¥ç©ã§ãã忢ã¯é»æºãåã£ãã ãã§ããã£ã¹ã¯(EBS)ã¯æ®ãããŸãèµ·åã§ããŸããçµäºã¯åé€ã§ãæ»ããŸãããEBSã®æéã¯åæ¢äžããããç¶ããã®ã§ããæ¢ããã®ã«è«æ±ãæ¥ããã¯ãããçç±ã§ããterminateããŠããåŸãã远å ããããªã¥ãŒã ã¯æ¢å®ã§æ®ããŸãã
ãã®å®æž¬ã®éçã3ã€ã1ã€ç®ãååšããªãããŒãã¢åãæå®ããŠãmotoã¯èµ·åãéããŸãããæ¬ç©ã®EC2㯠InvalidKeyPair.NotFound ã§åŒŸããŸãã2ã€ç®ãmotoã¯IAMããªã·ãŒã®è©äŸ¡ãããŸãã(simulate_principal_policy ã¯æªå®è£
ã§äŸå€ã«ãªããŸãã)ãã€ãŸããæš©éãè¶³ããã«èµ·åã§ããªããã®åçŸã¯ããŒã«ã«ã§ã¯ã§ããŸãããããã¯å®éã®ã¢ã«ãŠã³ãã§ç¢ºããããããªãéšåã§ãã3ã€ç®ãšããŠãã€ã³ã¹ã¿ã³ã¹ãããã¡ã€ã«ãäœã£ãçŽåŸã«èµ·åãããšãå®ã¢ã«ãŠã³ãã§ã¯åæ åŸ
ã¡ã§ Invalid IAM Instance Profile name ãè¿ãããšããããŸããmotoã§ã¯äžç¬ã§éãã®ã§ããã®åŸ
ã¡ãããŒã«ã«ã§ã¯äœéšã§ããŸããã
SSHã§å ¥ããªããšãã®ç¢ºèªé
ç«ãŠãåŸã«äžçªå€ãè©°ãŸãããssh ãè¿ã£ãŠããªã(ã¿ã€ã ã¢ãŠã)ãã§ããåå ã¯4ã€ã®ã©ããã§ãäžããé ã«èŠããšæçã§åœãããŸãã
ãŸããããªãã¯IPãåã£ãŠãç¹ãã«ãããŸãã
d = ec2.describe_instances(InstanceIds=[iid])["Reservations"][0]["Instances"][0]
print(d["State"]["Name"], d.get("PublicIpAddress"), d.get("KeyName"),
[g["GroupId"] for g in d["SecurityGroups"]])
# â running 54.xxx.xxx.xxx my-key ['sg-xxxx']
chmod 400 my-key.pem
ssh -i my-key.pem ec2-user@54.xxx.xxx.xxx
| é | çç¶ | èŠãæ | çŽãæ¹ |
|---|---|---|---|
| 1 |
PublicIpAddress ã None
|
ãã©ã€ããŒããµããããã«çœ®ããããŸãã¯ãããªãã¯IPèªåå²ãåœãŠãOFF | ãããªãã¯ãµããããã§èµ·åãçŽããVPCèšäºã®ãæ¡å æ¿ãã®ç¯ |
| 2 | IPã¯ãããã¿ã€ã ã¢ãŠã | ã»ãã¥ãªãã£ã°ã«ãŒãã®22çªãèªåã®IPã«éããŠããªã |
authorize_security_group_ingress ã§ 22/tcp ãèªåã®IPã«ã0.0.0.0/0 ã¯é¿ãã |
| 3 | Permission denied (publickey) |
éµãéãããŸãã¯éµãã¡ã€ã«ã®æš©éãç·©ã | èµ·åæã® KeyName ãšåã .pem ã確èªãchmod 400
|
| 4 |
Permission denied ã®ãŸãŸãŠãŒã¶ãŒåãæªãã |
OSããšã«ãã°ã€ã³åãéã | Amazon Linux 㯠ec2-userãUbuntu 㯠ubuntuãDebian 㯠admin
|
1ãš2ããããã¯ãŒã¯(VPCã»SG)ã3ãš4ãéµãšOSãã¿ã€ã ã¢ãŠããªãååãPermission denied ãªãåŸåããšçç¶ã§ååã«åããŸããããã§ãå
¥ããªããšãã¯ããµããããã®æ¡å
æ¿(ã«ãŒãããŒãã«)ã« 0.0.0.0/0 -> igw ãããããèŠã«è¡ã£ãŠãã ããã
人åŽã®æš©éã誰ãèµ·åããŠããã
3æ¹åã®3ã€ç®ã§ããEC2ãæäœãã人(ãŸãã¯CI)ã«ã¯ãIAMããªã·ãŒã§ããäžããŸãã
{
"Version": "2012-10-17",
"Statement": [
{"Effect": "Allow", "Action": ["ec2:Describe*"], "Resource": "*"},
{"Effect": "Allow",
"Action": ["ec2:RunInstances", "ec2:StartInstances", "ec2:StopInstances"],
"Resource": "*",
"Condition": {"StringEquals": {"aws:RequestedRegion": "ap-northeast-1"}}},
{"Effect": "Allow", "Action": "iam:PassRole", "Resource":
"arn:aws:iam::123456789012:role/ec2-s3-reader"}
]
}
3ã€ç®ã® iam:PassRole ãå¿ãããšãããŒã«ä»ãã®ã€ã³ã¹ã¿ã³ã¹ã ãèµ·åã§ããªãããšããåããã«ããè©°ãŸãæ¹ãããŸããã€ã³ã¹ã¿ã³ã¹ã«ããŒã«ãæž¡ãè¡çºãã®ãã®ã«æš©éãèŠãããã§ããæž¡ããŠããããŒã«ãéå®ããŠæžãã®ãå®ç³ã§ãResource: "*" ã«ãããšç®¡çè
æš©éã®ããŒã«ãä»ããã€ã³ã¹ã¿ã³ã¹ã誰ã§ãäœããŠããŸããŸãã
TerminateInstances ãå€ããŠããã®ãæå³çã§ããéçºè
ã«èµ·åãšåæ¢ã¯èš±ããåé€ã¯èš±ããªãããšããç·åŒããã§ããŸãã
æéã®èãæ¹
-
皌åæé: ã€ã³ã¹ã¿ã³ã¹ã
runningã®éã ã課éãLinuxã¯ç§åäœãRHELãSUSEãªã©åçšã©ã€ã»ã³ã¹OSã¯æéåäœã§èª²éãããŸãã忢äžã¯æ¬äœã®èª²éã¯ãŒã -
EBS(ãã£ã¹ã¯): 忢äžã課éãç¶ããterminateã§èªåçã«æ¶ããã®ã¯ã«ãŒãããªã¥ãŒã ã ãã§ãåŸãã远å ããããªã¥ãŒã ã¯æ¢å®ã§æ®ããŸãã
describe_volumesã§ç¶æ ãavailableã®ãŸãŸæºãŸã£ãŠããªããèŠãŠãã ãã - éä¿¡: ã€ã³ã¿ãŒããããžã®éä¿¡ã«èª²éãåä¿¡ã¯ç¡æ
- ãããªãã¯IPv4ã¢ãã¬ã¹: 2024幎2æããã䜿çšäžãã©ããã«é¢ä¿ãªã1ã¢ãã¬ã¹ããã0.005 USD/æé(æçŽ3.6 USD)ãEC2ã«èªåã§ä»ããããªãã¯IPããElastic IPã察象ã§ãã䜿ããªãElastic IPã¯è§£æŸããŠãã ãã
æš©éãšã¯çŽæ¥é¢ä¿ãããŸãããããterminateããæ¢ããã ããã®ã€ã³ã¹ã¿ã³ã¹ãšãåãæ®ãããããªã¥ãŒã ã¯ãæ°ä»ããªããã¡ã«ç©ã¿äžãããŸãã
ããããæ³šæç¹
-
22çªã
0.0.0.0/0ã«éããªãã èªåã®IP(/32)ã«éå®ããããSession Manager(SSM)ã䜿ã£ãŠ22çªãéãããŸãŸå ¥ãæ¹æ³ããããŸã -
ç§å¯éµã¯äœææã«ããåãåããªãã
create_key_pairã®æ»ãå€ãä¿åãå¿ãããšããã®ã€ã³ã¹ã¿ã³ã¹ã«SSHã§ã¯å ¥ããŸãã(SSM Session Managerãæå¹ã«ããŠããã°å¥çµè·¯ã§å ¥ããŸã) - ã¢ã¯ã»ã¹ããŒãEC2ã«çœ®ããªãã ããŒã«ã䜿ãã°ããŒã¯äžèŠã§ãã眮ããããŒã¯æŒãããããåãæ¶ããŸã§æå¹ãªãŸãŸã§ã
-
IMDSv2ãå¿
é ã«ããã æ°èŠäœææã«
HttpTokens: requiredãä»ããŸã -
SGã®èš±å¯ã¯è¶³ãç®ã çããããšãã¯
revoke_security_group_ingressã§å€ãè¡ãæ¶ããŸãã远å ããã ãã ãšäž¡æ¹æ®ããŸã -
iam:PassRoleãå¿ããªãã ããŒã«ä»ãèµ·åã ã倱æããåå ã®çé ã§ã
ãŸãšã
EC2ã¯ãAWSã®äžã«ã³ã³ãã¥ãŒã¿ãŒã1å°åããŠãèªåã®ããã°ã©ã ãåããç¶ããããµãŒãã¹ã§ããåãã1å°ãã€ã³ã¹ã¿ã³ã¹ã§ãOSãŸã§èªåã§è§ŠããŸãã
ãããŠæš©éã¯æ¹åã§3ã€ã«åãããšè¿·ããªããªããŸããå€ããå ¥ãæš©éãã»ãã¥ãªãã£ã°ã«ãŒããšããŒãã¢ããµãŒããŒèªèº«ãæã€æš©éãIAMããŒã«ãæäœããäººã®æš©éãIAMããªã·ãŒã
åé ã®2ã€ã®çç¶ã¯ãããã§åãåããããŸãã
- SSHã§å ¥ããªã â å ¥å£ã®åé¡ãèŠåå¡ã®ãªã¹ã(SGã®22çª)ããéµ(ããŒãã¢)ã®ã©ã¡ãã
- S3ãèªããªã â ãµãŒããŒèªèº«ã®åé¡ã瀟å¡èšŒ(IAMããŒã«)ãç¡ããããŒãããããéããŠãçŽããªã
æ¬¡ã«æãåãããªããSGã®22çªãèªåã®IPã«éå®ããç¶æ
ãã 0.0.0.0/0 ã远å ããŠãdescribe_security_groups ã§äž¡æ¹ã®è¡ãæ®ãã®ãèŠãŠãã ãããèš±å¯ãè¶³ãç®ã ãšäœã§åããã°ãEC2ã®èšå®ã§äºæ
ãå Žé¢ã¯ããªãæžããŸãã
次åã¯VPC(ãããã¯ãŒã¯)ãäºå®ããŠããŸãã
åè
- Amazon EC2 å ¬åŒããã¥ã¡ã³ã
- EC2ã®IAMããŒã«(ã€ã³ã¹ã¿ã³ã¹ãããã¡ã€ã«)
- ã€ã³ã¹ã¿ã³ã¹ã¡ã¿ããŒã¿ãšIMDSv2
- ã·ãªãŒãºçŽ¢åŒ: AWSãšã¯äœã
- åå: S3å ¥é / æš©éã®åºç€: IAMå ¥é



