[AWS] EC2 접속용 SSH 키페어 분실 또는 손상 시 키 재생성 방법

현재 운영 중인 EC2 인스턴스를 SSH로 접속하는 용도로 SSH Key-pair를 사용합니다. 서버에 public-key를 저장해놓고 private-key는 로컬에 보관하여 사용합니다. 일반적으로 PEM 키를 사용합니다.

사용 중인 맥북을 공장초기화하면서 로컬에 있던 개인키(private-key)가 안전하게 i-Cloud에 저장되어있을 것이라 생각했습니다. 생각대로 공장초기화 후 i-Cloud를 통해 개인키를 다운받았고 EC2 인스턴스를 SSH로 접속해봤습니다. 그런데 접속이 되질 않습니다.

Permission denied (publickey).

개인키 퍼미션도 600으로 낮춰놨고 아무런 문제가 없었지만 계속 저 메세지만 출력되었습니다. 끝내 i-Cloud로 복원된 개인키가 손상되었다는 결론을 내게 되었고 키페어를 새로 생성하기로 했습니다.

키 페어 새로 생성하여 적용하는 방법

1. 우선 SSH를 접속할 로컬 환경에서 키를 새로 생성한다. 아래 명령을 입력한뒤 엔터 연타

$ ssh-keyhen -m PEM

2. 생성된 개인키의 공개키(public-key)를 출력하여 복사한다.

$ ssh-keygen -y -f {개인키 파일 경로}

3. AWS EC2 콘솔 -> 해당 인스턴스 중지 -> 인스턴스 우클릭 -> Instance Settings -> Edit user data -> 아래 스크립트 입력

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [users-groups, once]
users:
  - name: ec2-user
    ssh-authorized-keys: 
    - {위에서 복사한 공개키}

4. 저장 후 인스턴스 시작

5. SSH 접속 테스트

$ ssh -i {개인키 경로} ec2-user@{접속 호스트}

6. 잘 되면 성공. 이제 3번에서 저장했던 스크립트를 삭제해야한다. 저 스크립트는 EC2 서버에서 .ssh/authorized_keys 파일에 공개키를 넣어주는 역할이다. 즉, 한번 실행되고 나면 역할을 다하는데다 콘솔에 공개키를 포함한 스크립트가 존재하는 것은 보안상 리스크가 있기 때문에 삭제 해주는 것이 좋다. 인스턴스를 다시 중지한 후 3번 Edit user data 화면에서 저장한 스크립트를 삭제 -> 저장 후 인스턴스를 다시 시작한다.

7. 최종 접속 확인. 5번 접속 테스트를 다시 한번 해보고 접속이 잘된다면 키페이 교체는 완료된 것이다.

[PHP] PHP5.x -> 7.0 으로 빠르게 버전 올리기

이 포스트는 AWS EC2 환경에서 nginx + php-fpm 을 사용하는 환경을 기준으로 작성되었습니다.

서버에 laravel을 설치해볼겸 기존 PHP5.6을 PHP7로 버전을 올려보려한다.

(이 블로그와 각종 개발용 사이트들 그리고 크롤러가 돌고 있는 서버에서..)

먼저 PHP7로 올렸을때 기존에 도는 웹사이트들이 영향이 가는지를 확인. 문제 없는 것으로 보인다. 그렇다면 시작!

 

+ 현재 설치되어있는 php 관련 패키지를 확인하고 php-fpm 설정을 백업한다.

설치 된 패키지 확인

php-fpm 설정 파일은 /etc/php-fpm.d/www.conf 파일이다. 잘 백업해두자.

 

+ php5.x 관련 패키지와 httpd 패키지 삭제

여기서 nginx를 쓰는데 httpd 패키지는 왜 지워? 라고 생각할 것이다. 구버전 httpd 패키지가 남아있다면 php7 패키지 설치가 되지 않는다. 나도 있는줄 몰랐는데 발견해서 삭제.

 

+ php7과 관련 모듈 설치

그 외 기존 설치되어있던 패키지를 확인하여 추가 설치한다. 엔터 쳐가면서 타이핑하기 귀찮다면 && 으로 연결해서 한번에 설치하자.

설치 후 service php-fpm restart와 service nginx reload를 하면 이상하게 에러 없이 재시작이 된다.

하지만 돌아가던 사이트는 500 bed gateway 에러를 보여줄 것이다.

당황하지 말고 nginx 에러 로그를 확인하면 php-fpm.sock 파일을 찾을 수 없단다.
그렇다. php-fpm 이 설치된 후 설정이 초기화 된 것이다.

설정 파일은 /etc/php-fpm-7.0.d/www.conf 에 존재한다. 백업해둔 기존 설정 파일을 참조하여 수정한다.

백업을 하지 않은 경우 저 에러를 해결하기 위해서는 www.conf 파일 내용 중 listen = 127.0.0.1:9000 을 listen = ‘/var/run/php-fpm.sock’ (기존 sock 파일 경로) 으로 변경해준다.
그리고 추가로 몇가지 수정해줄 것이 있다.

user = apache -> user = nginx
group = apache -> group = nginx
listen.acl_users = apache,nginx -> listen_acl_users = nginx (이건 그냥 두어도 무관하다.)

 

변경된 설정을 저장하고 service php-fpm restart와 service nginx reload 명령을 실행한다.

이제 사이트가 잘 나온다. 기존 php5.x 버전보다 속도도 빠르다!

 

정리하자면 PHP버전을 올리는데에는 기존 nginx 설정은 손댈 것이 없다.

패키지 삭제와 설치 후에 php-fpm의 소켓파일 경로만 잡아주고 재시작하기만 하면 된다.

 

간단해서 다행이다.

[Linux] 계정을 이용해 ftp 접속을 하기 위한 vsftpd 설정

서버 내 생성된 계정으로 ftp를 접속하도록 설정하는 방법을 소개합니다. 이 방법은 AWS의 EC2 에서도  가능합니다.

  1. vsftpd.conf 파일을 편집기로 엽니다. (예제는 vi 에디터)
  2. 아래와 같이 설정합니다.

     

참고 내용

  1. vsftpd가 설치되어 있지 않다면? 아래 방법으로 설치합니다.
  2. vsftpd 설치 후 chkconfig 등록
  3. AWS의 EC2 인스턴스를 사용중이라면?
    => Security Group에서 20-21, 1024-1048 인바운드 포트 대역을 추가해줘야 합니다.

[AWS] ACM(Amazon Certificate Manager)로 SSL 인증서 적용하는 방법

SSL 인증서를 알아보던 중 AWS에서 제공하는 ACM(Amazon Certificate Manager)가 있다는 것을 알았습니다. 비용은 무료이고 연 마다 갱신할 필요가 없다는게 가장 큰 장점입니다. AWS에서 제공하는 인증서를 적용하기 위해서는 몇가지 조건이 있습니다.

1. EC2 인스턴스를 1개 이상 구동 중이다.
2. Route53을 이용 중 이다.
3. ELB(Elastic Load Balancer) 또는 CloudFront를 이용 중 이다.

뭔가 많아보이지만 1, 2번만 기존에 사용중이라면 큰 문제는 없습니다. 3번은 ACM을 적용하기 위한 수단으로 필요한 것이라 진행하면서 소개해드립니다. 저는 ELB로 적용했기 때문에 ELB에 대해서 알려드립니다.

 

ACM을 이용해 인증서 발급 받기
1. AWS 콘솔에서 Security, Identity & Complian > Certificate Manager 를 클릭합니다.
2. 처음 페이지를 접속하면 get started 버튼이 나타나는데 클립합니다.
3. Request a certificate 클릭합니다.
4. 도메인을 입력하는데 모든 서브 도메인에 적용하시려면 *.도메인 (*.abc.com)으로 등록 하시면 됩니다. 그리고 Review and request 클릭,
5. Confirm and request 클릭
6. Continue 클릭
7. 상태가 Pending validation인 것이 보입니다. AWS 계정에 등록된 이메일을 확인하면 인증 메일이 와있습니다. 링크를 클릭한 후 페이지로 돌아와서 새로고침하면 상태가 Issued로 변경됩니다.
8. Issued 상태로 나타나면 발급 완료입니다.

 

ELB를 이용해 발급받은 인증서 적용하기
1. AWS 콘솔에서 Ec2를 선택합니다.
2. 좌측 Load Balancers를 클릭합니다.
3.Create Load Balancer를 클릭합니다.
4. Classic Load Balancer를 선택하고 Continue를 클릭합니다.
5. Load Balancer name에 적당한 이름을 정해 입력하고 Load Balancer Protocol 부분에 Add버튼을 눌러 HTTPS를 추가합니다.
6. SSH(또는 FTP)를 사용하시려면 추가로 TCP를 선택하고 22번 포트를 추가합니다.
7. 오른쪽 하단 Next Assign Security Groups를 클릭합니다.
8. Security Group을 선택하는데 기존에 EC2에 적용한 Security Group을 지정해도 되고 새로 만드셔도 됩니다. 그리고 Next: Configure Security Settings 클릭.
9. Choose an existing certificate from AWS Certificate Manager (ACM) 을 선택합니다.
10. Certificate 에서 ACM으로 발급받은 인증서를 선택합니다.
11. Select a Cipher는 그대로 두고 Next: Configure Health Check 클릭합니다.
12. Health Check Protocol에서 TCP를 선택하고 Next: Add EC2 Instances를 클릭합니다.
13. 적용하고자 하는 EC2 인스턴스를 선택하고 Next: Add Tags를 클릭합니다.
14. Review and Create 를 클릭합니다.
15. 생성이 시작되고 나면 Load Balancers > Description 탭에서  Status: * of * instances in service 또는 Instance 탭에서 Status가 In Service 면 정상 동작하는 것입니다.

* Status가 Out of Service 인 경우 Headth Check에 이상이 있는 것이니 설정된 프로토콜에 포트가 열려있는지 점검을 해봐야 합니다. 저는 HTTP 프로토콜로 Health Check가 정상 동작을 하지 않아 TCP로 방식을 변경했습니다.

 

Route53을 이용해 도메인에 ELB를 연결시키기
1. Route53에서 Hosted Zones를 클릭하고 연결시킬 도메인을 선택합니다.
2. Create Record Set을 클릭하고 Name란에 원하는 Host(서브도메인)을 지정합니다.
3. Alias를 Yes로 선택하고 Alias Target에서 생성한 ELB를 선택합니다.
4. Save Record Set을 클릭합니다.
5. 5분 정도 후에 설정한 도메인으로 접속 테스트를 해봅니다.

* 서버에서 SSL을 위한 Apache나 Nginx 추가 설정은 필요가 없습니다. 신규 도메인인 경우 해당 도메인에 대한 가상호스트(Virtual Host) 설정만 해주면 됩니다.

 

이렇게 3가지 과정으로 나눠집니다. 크게 어려운 부분은 없지만 저는 ELB의 Heath Check 부분에서 정상 동작이 되지 않아 한참 찾아보며 해결을 했습니다.

SSL인증서(ACM)는 무료지만 Route53는 무료가 아닌 점 참고하세요. Route53은 도메인 당 0.5 USD가 매달 과금됩니다. 레코드 갯수는 제한이 없습니다.