프로그램의 서버 본체를 ec2 인스턴스에 올려 관리하고 있던 중
프로그램 일부분을 외주에게 맡길 부분이 있었고
외주가 맡은 부분을 이 인스턴스 내부에서 새로운 사용자를 부여하여 같이 관리를 해야했기 때문에
인스턴스 접속을 공유해야하는 일이 생겼다.
내가 ec2서버를 만든 후 부터 디폴트로 사용하던 사용자 이름을
ubuntu
접속주소를
ubuntu@ec2-12-345-678-90.ap-northeast-2.compute.amazonaws.com (가주소),
인스턴스 생성 시 새로 발급받은 key-pair이름을
ubuntukey.pem
이라고 하자.
<가정>
사용자이름 : ubuntu
키 파일 : ubuntukey.pem
접속주소 : ubuntu@ec2-12-345-678-90.ap-northeast-2.compute.amazonaws.com (가주소)
외주의 인스턴스 접속을 위해
위의 내가 사용하던 사용자이름, 접속주소, 키페어를 그대로 전달한다면
본래 내가 인스턴스에서 굴리고 있던 프로그램들의 보안에 큰 위험이 될 수 있다.
그래서 나는 인스턴스에 새로운 계정을 만들어 접속방법을 외주에게 알려주어야 하는데
문제는 이 외주 계정을
1) 어떻게 외주 자체로 안전하게 들어오게 하느냐
2) 내가 만들던 프로그램 본체에 접근하지 못하게 하느냐
두가지를 고려해야 했다.
이를 위한 두가지의 방법을 소개하고자 한다.
결론부터 말하면 그 방법은 두가지가 있다
1. 새로운 계정에 새로운 키페어를 만들어 접속주소와 함께 넘겨준다.
2. 새로운 계정에 비밀번호를 설정하여 접속주소와 함께 넘겨준다.
(나는 뭣도모르고 키페어와 비밀번호를 동시에 넘겨주어 보안에 큰 실수를 저지를 뻔했다. 뒤에 설명)
1. 새로운 계정에 새로운 키페어를 만들어 접속주소와 함께 넘겨준다.
(장)
- 키파일이 없으면 접속이 불가능하기 때문에 보안이 강하다
(단)
- 키파일을 생성하기까지 비교적 복잡하다(그리 복잡한 것도 아니다)
- 키파일의 위치를 잘 관리해야 한다. 없어질 경우 재생성 불가능
0) 기존에 내가 인스턴스에 접속하던대로 ubuntu로 접속
[pc]$ sudo ssh -i "ubuntukey.pem" ubuntu@ec2-12-345-678-90.ap-northeast-2.compute.amazonaws.com
1) 새로운 사용자 생성
[ubuntu]:~$ sudo adduser newuser
2) 새 사용자의 전용 키 생성
[ubuntu]:~$ sudo su newuser // 새로운 유저모드(newuser)로 전환
[newuser]:~$ ssh-keygen -t rsa //newuser 전용 키페어 생성
3) 생성된 public키와 private키에 대한 조정
2)에서 새로운 키페어를 생성하면
.ssh라는 경로가 생성되고
public키와 private키가 각각 생성된다
[newuser]:~$ cd .ssh
[newuser];~/.ssh$ ls
id_rsa id_rsa.pub
(1) id_rsa.pub : public키 => 이 위치에 고정되어 있고 key로그인 시 인증도구가 된다, authorized_key로 이름을 변경해주어야 한다.
(2) id_rsa : private키 => 지금은 리눅스에 위치해 있지만 pc로 꺼내서 key로그인시 key로 사용할 것이다.
[newuser];~/.ssh$ ls
id_rsa id_rsa.pub
[newuser]:~/.ssh$ mv id_rsa.pub authorized_keys //(1)
[newuser]:~/.ssh$ ls
authorized_keys id_rsa
4) (2)에서 말했던 것처럼
id_rsa => pc의 바탕화면으로 빼서 [newKey].pem으로 저장(그냥 텍스트 파일이어도 된다.)
<순서>
(1) id_rsa를 ubuntu계정 소유로 전환
(2) id_rsa를 ubuntu 디렉토리로 이동
(3) pc에서 ubuntu디렉토리로 이동되었던 id_rsa를 꺼내와 pc에 newkey.pem으로 저장
(1) id_rsa를 ubuntu계정 소유로 전환
- id_rsa는 newuser계정에서 ssh-keygen으로 만든것이기 때문에 권한이 소유자만 접근가능하고 소유자는 newuser로 되어있다
- 우리는 나중에 이 파일을 ubuntu(소유자x)의 이름으로 pc로 꺼내와야 하기 때문에 소유자를 ubuntu로 바꿔주어야 한다.
[newuser]:~/.ssh$ exit // 계정 전환된것에서 다시 ubuntu계정으로 돌아온다
[ubuntu]:~$ sudo su //계정을 root로 전환(id_rsa의 권한변경을 할 수 있는 존재)
[root]:~$ cd /home/newuser //newuser 디렉토리로 이동
[root]:/home/newuser# ls -al // 원래의 id_rsa소유자 확인
...
-rw------- 1 newuser newuser 1679 Mar 6 22:04 id_rsa //id_rsa의 소유자로 newuser이 설정되어 있다
...
[root]:/home/newuser# chown ubuntu:ubuntu id_rsa // id_rsa파일의 소유자를 ubuntu로 변경
[root]:/home/newuser# ls -al //다시 id_rsa 소유자 확인
...
-rw------- 1 ubuntu ubuntu 1679 Mar 6 22:04 id_rsa //id_rsa소유자가 ubuntu로 변경되었다
...
(2) id_rsa를 ubuntu 디렉토리로 이동
- id_rsa의 소유자로 ubuntu를 설정하면 이 파일을 pc꺼내오기 위한 준비는 모두 끝난 것이다.
- AMI로 생성된 ubuntu는 sudoer이기 때문에 newuser디렉토리에 있는 id_rsa에도 접근할 수 있어 파일의 디렉토리를 굳이 변경하지 않아도 되지만 그래도 ubuntu이름으로 꺼내오는거니 만큼 디렉토리도 ubuntu앞으로 이동해보자
[root]:/home/newuser# mv id_rsa /home/ubuntu // /home/newuser에 원래 존재했던 id_rsa를 /home/ubuntu디렉토리로 이동
[root]:/home/newuser# cd /home/ubuntu
[root]:/home/ubuntu# ls // /home/ubuntu: ubuntu디렉토리로 이동되었다.
id_rsa
(3) pc에서 ubuntu디렉토리로 이동되었던 id_rsa를 꺼내와 pc에 newkey.pem으로 저장
- pc에서 인스턴스에 ssh접속을 위한 key로 사용해야하기 때문에 pc로 꺼내와야한다.
[root]:/home/ubuntu# exit
[ubuntu]:~$ exit
[ubuntu]:~$ exit // pc로 나갈때 까지 exit 반복
[pc] % cd Documents // ubuntu key파일이 저장된 디렉토리로 이동 => Documents 폴더에 저장되어있다고 해보자
[pc] Documents % sudo scp -i "ubuntukey.pem" ubuntu@ec2-12-345-678-90.ap-northeast-2.compute.amazonaws.com:/home/ubuntu/id_rsa ./newkey.pem
// ubuntu 권한을 이용하여 접속한 다음 /home/ubuntu에 저장해두었던 id_rsa파일을 복사해와 pc에 newkey.pem으로 저장
[pc] Documents % ls // newuser로 ssh접속을 위한 newkey.pem이름의 key파일이 생성되었다.
ubuntukey.pem newkey.pem
5) pc로 만들어와 생성된 키 newkey.pem을 이용해 newuser 사용자로 ssh 접속
[pc] Documents % sudo ssh -i "newkey.pem" newuser@ec2-12-345-678-90.ap-northeast-2.compute.amazonaws.com
[newuser]:~$ //newuser사용자로 인스턴스에 접속하였다.
2. 새로운 계정에 비밀번호를 부여하여 접속주소와 함께 넘겨준다.
(장)
- 생성이 굉장히 간단하다.
- 로그인도 키파일 없이 로그인 할 수 있어 간단하다
(단)
- 텍스트 비밀번호인 만큼 해킹당하거나 유출될 경우 보안이 뚫리기 쉽다
root =>
0) 기존에 내가 인스턴스에 접속하던대로 ubuntu로 접속
[pc]$ sudo ssh -i "ubuntukey.pem" ubuntu@ec2-12-345-678-90.ap-northeast-2.compute.amazonaws.com
1) 새로운 사용자 생성, 비밀번호 설정 - password만 설정
[ubuntu]:~$ sudo adduser newuser
Adding user `final' ...
Adding new group `final' (1004) ...
Adding new user `final' (1004) with group `final' ...
Creating home directory `/home/final' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: // 비밀번호 설정
Retype new UNIX password: // 비밀번호 재설정
passwd: password updated successfully
Changing the user information for final
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y // 맞다~
[ubuntu]:~$
2) 이제 바로 접속 가능하다..!
[ubuntu]:~$ exit
[pc] %
[pc] % sudo ssh -i "" newuser@ec2-54-180-117-56.ap-northeast-2.compute.amazonaws.com // 비밀번호만을 사용해 접속을 하는것이기 때문에 key가 따로 필요없다
Password:
Warning: Identity file not accessible: No such file or directory.
final@ec2-54-180-117-56.ap-northeast-2.compute.amazonaws.com's password: //설정했던 패스워드만 입력하면 된다
[newuser]:~$ // 접속완료
본론은 끝났다
마지막으로 하고싶은 말은
새로운 사용자 ssh 접속에 대해 구글링을 많이 해봤는데
위의 두가지 방법을 섞어서 설명하는 글도 많이 봤다. (나도 그랬다)
잘 섞이면 뭐 새로운 사용자에 대한 보안상의 문제를 피할 수 있겠지만
그렇지 않은 경우 위험에 노출될 수 있다.
예를 들어 위에서 AMI로 생성된 사용자인 ubuntu에 대해 생성된 키인 ubuntukey.pem은 새로운 사용자와 전혀 관련이 없고
절대 ubuntukey.pem을 같이 넘겨주어서는 안된다.
sudo ssh -i "newkey.pem" newuser@ec2-12-345-678-90.ap-northeast-2.compute.amazonaws.com -v
접속 명령어 마지막에 -v를 붙이면 접속과정을 debugging할 수 있는데 보면
debug1: Authentications that can continue: publickey,password
라고 말한다. 즉
newuser가 ssh 접속할 때 publickey 혹은 password로 동등하게 접속이 가능하다는 말이다.
따라서 password를 안다면 저 "newkey.pem"을 검사할 필요가 없기 때문에 "" 같이 공백으로 둬도 된다는 뜻이다.
혹시 저 문장을 잘못 해석해 비밀번호 접속에도 ubuntukey.pem이 필요하다고 생각하면 안된다.
그렇게 된다면
내가 ec2 인스턴스 첫 생성시 AMI로 ubuntu를 선택하였는데 자동으로 owner 사용자이름이 ubuntu로 설정되는 것은 공통적이기 때문에
다른사용자가 그대로 ubuntu라는 사용자이름을 예측할 수 있고
사용자 이름, 키파일, 접속주소를 그대로 사용하여
sudo ssh -i "ubuntukey.pem" ubuntu@접속주소
를 통해 그대로 프로그램의 본체가 뚫리게 되는 상황이 마련된다.
혹시나 다른사용자에게 접속권한을 부여할 때 저 ubuntukey.pem을 같이 넘겨줄 생각을 하는 사람이 생기지 않았으면 바란다.
'인포테인먼트 - development > linux' 카테고리의 다른 글
[linux] MySQL 포트 변경하기 (0) | 2020.04.07 |
---|---|
[linux] zsh의 .zshrc 변경 후 변경사항 저장 (0) | 2020.03.31 |
[nginx] 서버에 https 설정 시 자동 Let's encrypt 인증서 갱신 및 자동 nginx 리로드(Reload) (0) | 2020.03.28 |
[nginx] sites-available에 만든 파일 sites-enabled에 include시키기 (0) | 2020.03.26 |
[nginx] nginx에 프록시, 로드밸런싱 설정하기 (0) | 2020.03.24 |
댓글