요새의 주인이 되다

5145 단어 cloudskills
만약에 우리가 양호한 안전 실천을 따르고 데이터베이스를 개인 서브넷에 배치한다면 데이터베이스에 직접 접근하면 더욱 광범위한 인터넷과 차단될 것이다.이것은 안전성에 매우 좋으나, 로컬 기기에서 빠른 SQL 명령을 실행하고, 같은 네트워크에 없는 서버에 연결하거나, API를 만들지 않고 데이터를 다운로드하기만 하면 낙담할 수 있다.다행히도, 우리는 이 문제를 돌릴 수 있으며, '요새 호스트' 를 사용하여 우리의 데이터베이스를 공공 인터넷에 노출할 필요가 없다.

보루 주인은 무엇입니까?


중세 건축에서 보루는 방어 공사에 있어서 두드러진 물건으로 가장 전략적인 유리한 위치를 제공하며 건축에 어떠한 약점도 가져오지 않는다.따라서 만약에 우리가 이 점을 우리의 문제와 연결시키면 컴퓨터 과학의 요새 호스트는 유사한 역할을 발휘할 것이다. 즉, 인프라 시설의 네트워크 공격의 표면적인 면적을 늘리지 않고 개인 네트워크에 들어가는 접속점을 제공하는 것이다.실제로 본 논문에서 우리는 AWS 인프라를 사용하지만 이러한 원칙은 우리가 사용할 수 있는 모든 규모의 시스템에 적용된다.우리의 예에서, 우리가 PostgreSQL로 설정한 RDS 실례를 가정하면, 이것은 VPC의 개인 서브넷에 있다.우리는 자신의 탁월한 식견을 자랑스럽게 여기고, 응용 프로그램의 안전을 확보하는 데 있어서 대다수 사람들보다 더 많은 일을 하고 있다는 것을 깊이 알고 있다.몇 차례의 돌진 후에 우리 프로젝트 매니저는 우리에게 대형 고객 회의를 위해 지난 몇 달 동안의 데이터를 수집할 것을 요구했다. 이번 임시 회의는 예견할 수 없는 것이기 때문에 수집할 시간이 많지 않았다.개인 서브넷에 데이터베이스를 설치했기 때문에 SQL 조회를 실행하기 위해 연결할 수 없고, 프로그램 코드를 업데이트해서 이 데이터를 검색할 시간도 충분하지 않기 때문에, 연결을 에이전트하기 위해 요새 호스트를 만들어야 한다.

요새 호스트를 만드는 방법



우리가 만들 구조

배포 서버


우리는 dashboard 또는 command line 간단한 EC2 실례 (Amazon Linux나 Ubuntu를 실행하는 T2 Micro가 정상적으로 작동할 수 있음) 를 배치해서 우리의 데이터베이스와 같은 VPC에서 시작하지만 공공 서브넷에서 시작할 수 있도록 할 수 있다.이것은 우리의 보루 주인이 될 것이다.
aws ec2 run-instances --image-id ami-xxxxxxxx --count 1 --instance-type t2.micro --key-name MyKeyPair --security-group-ids sg-903004f8 --subnet-id subnet-6e7f829e
참고 ID 및 자격 증명을 사용자 고유의 정보로 바꿉니다.

방화벽 구성


서버가 시작된 후(또는 계기판에 서버를 만들 때) bastion 호스트와 데이터베이스의 보안 그룹을 조정하여 컴퓨터가 포트 22에서 bastion 호스트와 ssh 연결을 하고 터널을 통해 psql 연결을 bastion에서 데이터베이스로 연결할 수 있도록 합니다.
다음 섹션에서는 AWS CLI를 사용하여 방화벽을 구성하여 이러한 정보가 AWS에서 자주 변경되는 환경과 최신 상태로 유지되도록 하는 방법에 대해 설명합니다.
이 예에서는 IP로부터의 연결만 허용할 것이므로 먼저 이 정보를 얻도록 하겠습니다.
curl https://checkip.amazonaws.com
이렇게 하면 IP 주소(예: 203.0.113.57)가 반환됩니다.
다음은 포트 22의 전송 연결을 받기 위해 EC2 요새 호스트를 업데이트합니다.
aws ec2 authorize-security-group-ingress --group-name ec2-bastion-sg --protocol tcp --port 22 --cidr 203.0.113.0/24
마지막으로, bastion 호스트에서 포트 5432(postgres)에 연결할 수 있도록 데이터베이스 보안 그룹을 업데이트할 것입니다.
aws ec2 authorize-security-group-ingress --group-name rds-postgre-sg --protocol tcp --port 5432 ---source-group ec2-bastion-sg 
*참고: 우리는 각각 요새 호스트와 데이터베이스 실례의 보안 그룹 IDgroup-name를 사용하고 IP 주소cidr를 사용해야 한다.

요새 호스트에 연결


실례적인 시작, 방화벽 설정, 테스트 (ssh를 통해 요새 호스트에 연결할 수 있어야 함) 를 한 후에 연결을 만들 수 있습니다.

SSH 터널 열기


ssh -i "~/bastion_key.pem" -NL 8886:postgress.cpypigm0kth7.us-east-1.rds.amazonaws.com:5432 [email protected] -v
8886은 우리 로컬 기계에서 연결을 여는 데 사용되는 포트이다.우리는 이곳에서 사용할 수 있는 모든 포트를 선택할 수 있다.로고-N은 터널을 설정하고 bastion 서버와의 세션을 만들지 않으며, -L은 전송 포트를 설정하고, -v는 출력 로그를 컨트롤러에 출력합니다.
출력 디스플레이 연결이 성공적으로 이루어지면, 기계의 정확한 감청 포트를 확보하기 위해 포트를 검사해야 한다.
sudo lsof -iTCP -sTCP:LISTEN -n -P | grep -i --color 8886
또는, 우리는 ssh 설정 파일에 연결을 활성 상태로 유지하기 위해, 짜증나는 세션 시간 초과를 피할 수 있습니다.
cat <<EOT >> ~/.ssh/config
Host *
    ServerAliveInterval 30
    ServerAliveCountMax 2
EOT

데이터베이스에 연결


이제 우리는 우리의 데이터베이스에 연결할 수 있을 것이다.postgres를 사용하는 경우 명령은 다음과 같습니다.
psql -h localhost -p 8886 -U <username> -W
이렇게현재 우리는 이 연결을 사용하여 중요한 고객 회의의 정보를 제때에 다운로드하고 이 해결 방안을 우리가 미래에 직면할 수 있는 모든 문제에 다시 사용할 수 있다.

결론


한 마디로 하면 공공 서브넷의 데이터베이스 VPC에서 EC2 실례를 만들고 방화벽을 설정하고 ssh 터널을 구축함으로써 우리는 개인 서브넷에서 데이터베이스와 상호작용을 할 수 있으며 너무 많은 추가 인프라 시설을 도입하거나 응용 프로그램의 안전성을 떨어뜨리지 않는다.
특정 공급업체, 데이터베이스 또는 로컬 기기에 대체 해결 방안을 제공하려면 댓글을 남겨주세요. 제가 댓글에 추가하겠습니다!

좋은 웹페이지 즐겨찾기