0부터 시작하는 Linux 공부 - SSH 연결
시나리오. centOS 7 이라는 인스턴스를 생성했다. 주소는 211.183.3.201 이고, EC2 USER가 만들어져 있으며, 해당 계정은 WHEEL 그룹에 포함되어 있어, SUDO를 통해 필요할 때 마다 root의 권한을 불러와서 실행할 수 있다. public key는 인스턴스에 위치하고, private key는 윈도우에서 보관하며 접속할 계획이다
1. ip 점검
- ip를 확인한다
- ping을 통해 외부와의 통신을 점검한다
- ifdown ens32 ; ifup ens32 를 통해 인터페이스를 껏다 켜본다
- 이래도 안되면, 가상 머신 네트워크 문제일 수 있으므로, 네트워크 설정에서 해당 vmnet을 껏다 켜본다
- 이는 v switch를 껏다 키면, 하이퍼 바이저에서 물리 자원의 nic를 통해 다시 v switch를 구성해주기에, 문제가 해결 가능하다. 이래도 안되면 ip를 잘못 설정한 것 이다
2. SSH 동작 확인
- sshd 를 restart하고, status로 상태를 확인하면, 잘 실행되는 것을 확인 가능 하다
3. SSH 를 위한 설정 파일 확인하기
- 모든 시스템은 구성 파일이 있으며, daemon이 해당 구성 파일을 읽고 서비스를 구성한다
- sshd_config 파일은 외부에서 내부로 접속하게 해주는 서비스에 대한 구성 파일이다
- 접근 포트 번호 / root 로그인 허용 / 클라이언트 인증 방식 과 같은 다양한 설정들이 있다
- public key 인증 방식을 허용했을 때, 해당 public key를 .ssh 디렉토리 안의 authorized_keys에 저장하겠다고 설정한 것 이다. 따라서 사용자 인증시 public key를 해당 파일에서 찾는다
4. 접속을 위한 계정 생성
- ec2-user라는 계정을 생성하고, password를 test123으로 설정한다
- 해당 계정으로 접속하여, 홈 디렉토리로 이동한다
5. Key-Pair 만들기
- Key-Pair를 만들면 .ssh 폴더가 생긴다. 해당 폴더에 key가 잘 생성되었다. pem 파일은 개인 키 이고, pub 파일은 공개 키 이다. 이 공개 키는 authorized_keys 에 넣어야 한다
- cat을 통해 public key 내용의 출력을 보내서 authorized_keys 파일을 생성함과 동시에 public key 키의 내용을 넣어주어 public key 를 authorized_keys에 저장했다
- head를 통해 파일 내용을 확인하자
- cat 0720.pem 을 통해 안에 Key 를 복사해서, 윈도우 상의 메모장을 실행하여 붙여넣기 해준다. 메모장은 모든 파일로 pem 파일을 만들어서 저장해준다
6. ec2-user 가 sudo 명령어를 사용할 수 있게 하기
- ec2-user 를 wheel 그룹에 넣어 줘야 한다
- sudoers 파일을 편집기로 열어주자
- 107 번째 줄은 wheel 그룹 user 들은 root 권한 사용 가능하나 sudo 명령시 패스워드를 요구 받는다는 설정이다
- 110 번째 줄은 패스워드를 요구 받지 않는 설정이다
- a는 기존 그룹을 유지하며, 추가로 그룹에 포함되게 한다. -G 옵션과 함께 쓰여야 한다
- 소문자 g는 gid를 변경시켜, 그룹을 변경시킨다
- 대문자 G는 gid가 바뀌지 않으며, 추가로 다른 그룹에 포함되게 한다
- 위 명령어를 통해 ec2-user를 wheel 그룹에 포함시킨다
- 이로써 wheel 그룹은 sudo 명령을 하여 루트의 권한으로 명령 실행이 가능하되, password는 요구하지 않으며, ec2-user는 wheel 그룹에 포함된다
7. putty 로 원격 접속
- 다음과 같이 접속해서 명령 실행이 가능하다
- 만약 안된다면, key를 gedit 창을 줄여서 복사해보자. 너무 늘려서 복사하면 공백이 들어가서 key 인증에 실패할 수 도 있다
- ls -l은 ll로도 사용 가능
- sshd_config에서 password 인증을 주석 처리하고, root login 허용을 주석 해제 하자
8. SSH 연결 과정
- 서버 인증 : 클라이언트가 서버를 인증
- 사용자 인증 : 서버가 정상적인 사용자인지 여부를 확인
- 세션키의 DH는 위에서 설정한 Diffle-Hellman group 을 사용한다
- 세션 형성 후 데이터 전송할 때는 데이터를 세션키로 암호화해서 보내고, 데이터를 받으면 복호화 한다
- 우리는 실습에서 서버에서 key-pair를 만들었지만, 실무에서는 client에서 만드는게 좋다
서버 인증 - 클라이언트에서 진행
- 클라이언트가 서버에 ssh 요청을 보내면, 서버는 가지고 있던 서버 인증용 공개 키를 클라이언트에게 보낸다
- 클라이언트는 받은 공개 키를 known_hosts 에 저장
- 클라이언트가 다시 접속 요청을 보내면, 서버가 또 공개 키를 보낸다
- 클라이언트가 known_hosts에 공개 키를 가지고 있으면, 둘이 비교하여 동일하면 서버 인증을 마치고 세션 키가 생성된다
사용자 인증 - 서버에서 진행
- 클라이언트에서 키페어를 만들어 공개 키는 서버에게 보내 authorized_keys에 저장하고, 사설 키는 가지고 있는다 ( 실무에서는 관리 서버에서 만들어 뿌려주고, 관리 서버는 스스로 가지고 있는 사설 키를 제거한다 )
- 클라이언트가 자신의 키 페어 id를 서버에 요청한다
- 서버가 자신의 authorized_keys에 키 페어 id를 탐색한다. 각 공개 키는 끝에 @username과 같이 구분된다. 이를 찾아서, 만약 키 페어 id에 해당하는 공개 키가 있다면, 난수를 생성한다
- 난수를 공개 키로 암호화해서 보낸다. 클라이언트는 해당 암호화 데이터를 사설 키로 복호화한다
- 복호화해서 나온 난수를 md5 ( 해시 함수 ) 에 넣어 문자열을 출력한다 . 이 문자열을 서버에 보내, 서버에서도 난수를 md5에 넣어 나온 문자열과 비교하여 무결성 검사를 한다
- 무결성 검사에 통과하면 세션이 형성되고, 이 세션 안에서 데이터를 세션키로 암호화해서 전송한다
9. Data Center 에서 원격지 연결을 위해 해야할 것
- 템플릿 이미지를 준비한다
- 이미지 수정하기
- public key 인증 활성화
- 사용할 계정 미리 만들어 두기
- key-pair 만들기 ( 이미지에서 꼭 만들지 않아도 된다. bastion host [ 관리용 서버 ] 에서 만드는 것이 좋다 )
- public key 를 기본 이미지에 추가적으로 부착한다 ( virt-customize -a 이미지파일 --upload mykey.pem.pub:/계정 홈 디렉토리/.ssh/authorized_keys ) 를 통해 public key를 이미지의 authorized_keys에 넣어준다
- private key 는 클라이언트에게 보여준다. 혹은 다운로드 해준다. 이후, private key 는 가지고 있으면 안되므로, 삭제한다
- 템플릿 이미지를 인스턴스로 실행한다
- 생성된 인스턴스의 정보는 DB에 저장한다. 이때, 인스턴스의 Ip / cpu / ram / Host zone 등의 정보를 저장한다
- 사용자는 관리 페이지에서 Ip를 확인하고 접속한다 ( ' ssh -i mykey.pem Ip 주소 ' 혹은 ppk 파일을 putty 와 연결하여 접속 )