CircleCI2.0에서 EC2에 액세스할 때만 특정 IP를 허용하고 싶습니다.

Yper 주식회사 에서 엔지니어를하고 있습니다.
개인정보라든지 취급하므로 보안을 굳히고 있어, CircleCI의 편리함과 배팅했을 때의 메모입니다.

하고 싶은 일



EC2에 CircleCI에서 SSH하고 뭔가 하고 싶다는 말은 없습니까?
적당히 capistrano 서버 두드려 배포하고 싶다든가, 뭔가 없습니까.
괜찮아요.



그런데 어색하고, 대개의 경우는 22번 포트를 무제한으로 허가하거나 하고 있지 않다.
발판 서버에서만이라든지, 오피스의 IP가 아니면 안된다든가, 그런 보안 그룹을 설정해 어쩐지 좋은 느낌으로 화이트 리스트 만들지요.

하지만 CircleCI는 작업을 시작할 때마다 IP 주소가 바뀌므로 이런 느낌이 드는 것입니다.


그래서 CircleCI의 스크립트 안에 동적으로 액세스원 IP를 허가하는 처리를 써주면 좋은 느낌으로 여러가지 작업이 끝나게 됩니다.

CircleCI 용 IAM을 흔들어주세요.



무엇이든 간에 EC2FullAccess 같은 건 아니죠?
제대로 보안 그룹을 변경하기 위한 정책을 만들어 둡시다.
우선 전부 허가 안 절대.

IAM으로 날아가


정책 작성으로 이동


정책을 JSON으로 입력합시다.


예 코피페용

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:RevokeSecurityGroupIngress"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:ec2:*:*:security-group/*"
        }
    ]
}

적당히 이름이나 넣어 등록


사용자 이름을 적절하게 지정하십시오.


방금 만든 정책을 첨부하여


태그는 우선 하늘


사용자 작성을 포치


분실하지 않도록 메모하거나 CSV를 다운로드하십시오.


CircleCI 설정 화면에서 액세스 키를 환경 변수에 넣습니다.



config.yml에 직접 쓰거나 하면 안 된다. 절대다.

대상 프로젝트의 설정 화면으로 이동


환경 변수 설정 열기

AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY를 Name으로 설정하여 방금 만든 사용자의 정보를 각각 등록합니다.


CircleCI의 config.yml을 작성해보십시오.



일부러 한 줄씩 써 보면 이런 느낌

config.yml
version: 2
jobs:
  deploy:
    docker:
      - image: circleci/python:3.6-jessie
      - image: buildpack-deps:trusty
    working_directory: ~/
    steps:
      - run: sudo pip install awscli
      - run:
          name: "authorize-security-group-ingress"
          command: |
            IP=`curl -s ifconfig.me`
            echo "#!/bin/bash" > ./sg.sh
            echo "aws configure set region ap-northeast-1" >> ./sg.sh
            echo "aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxxxxxxxx --protocol tcp --port 22 --cidr ${IP}/32" >> ./sg.sh
            bash ./sg.sh
      - add_ssh_keys:
          fingerprints:
            - "xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
      - run:
          name: deploy
          command: ssh -oStrictHostKeyChecking=no [email protected] "bash /home/circleci/script/deploy.sh"
      - run:
          name: "revoke-security-group-ingress"
          command: |
            IP=`curl -s ifconfig.me`
            echo "#!/bin/bash" > ./sg.sh
            echo "aws configure set region ap-northeast-1" >> ./sg.sh
            echo "aws ec2 revoke-security-group-ingress --group-id sg-xxxxxxxxxxxxxx --protocol tcp --port 22 --cidr ${IP}/32" >> ./sg.sh
            bash ./sg.sh

workflows:
  version: 2
  test:
    jobs:
      - deploy:


aws-cli의 컨테이너라든지 준비는 되어 있었지만, 왠지 이끼가 많았기 때문에 결국 pip install 로 넣고 있습니다.
aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxxxxxxxx --protocol tcp --port 22 --cidr ${IP}/32이 부분의 sg-xxxxxxxxxxxxxx 는 액세스하고 싶은 EC2 인스턴스에 연결하고 있는 보안 그룹의 ID를 넣어 주세요.

이미지적으로는 이런 흐름

그러나 배포 중에 작업이 떨어지면 보안 그룹을 닫는 것을 잊어 버리므로 여러 가지 방법으로 모니터링해야합니다.

aws-cli는 환경 변수에 액세스용의 정보를 넣어 두면 마음대로 읽어 주므로 편하네요.
(참고 : AWS CLI 환경 변수 치트 시트)

SSH용의 설정의 핑거프린트 운하라든지, 특정의 브랜치에 푸시 하면 운운, 라든지는 ↓의 기사가 알기 쉬웠으므로 추천입니다.
호스트도 환경 변수 넣어라! 라든지 돌진하지 마십시오. 죄송합니다.
Circle CI로 웹 사이트를 자동 배포

좋은 웹페이지 즐겨찾기