DevOps/Linux

[Linux] Remote Access : Encryption

나죽못고나강뿐 2023. 7. 23. 14:36
📕 목차

1. 암호화(Encryption)
2. OpenSSH
3. SSH로 Remote Server Login
4. non-password SSH 접근
5. SCP
6. Linux Process Control
더보기

🌱 명령어 정리

 

# APT 기반의 소프트웨어 패키지 상태 검사
dpkg -s openssh-client

# 시스템 프로세스(systemd) 상태 검사
systemctl status ssh

# 서비스 시작
systemctl status ssh

# 컴퓨터에 있는 네트워크 인터페이스를 모두 나열
IP ADDR

# ssh 키 쌍을 새로 생성
ssh-keygen

# 원경 컴퓨터에 로컬 컴퓨터의 SSH 공개 키를 복사해 추가한다.
cat .ssh/id_rsa.pub | ssh (계정)@(ip) "cat >> .ssh/authorized_keys"

# 암호화 키를 안전하게 복사한다 (권장 표준)
ssh-copy-id -i .ssh/id_rsa.pub (계정)@(ip)

# 세션에 사용할 키 쌍을 지정
ssh -i .ssh/myKey.pen (계정)@(ip)

# 로컬 파일을 원격 컴퓨터에 안전하게 복사
scp myfile (계정)@(ip):/home/(계정)/myfile

# 현재 실행 중인 프로세스들을 모두 나열 후 init 문자열 담은 줄만 추출
ps -ef | grep init

# 현재 실행 중인 모든 시스템 프로세스를 트리 모양으로 시각화
pstree -p

1. 암호화(Encryption)

 

📌 As-is

와이어샤크로 패킷 따내다가 지인 발견했던 사건

  • 예전에는 Network를 통해 원격으로 로그인 가능한 텔넷(telnet)이 있었다.
    • 빠르고 신뢰성 있었으며, Network 사용자가 적던 과거에는 적합했다.
    • 데이터 패킷을 암호화하지 않고 전송해서 최근에는 보안 상 이슈가 발생한다.
  • wireshark나 packet-sniffing같은 도구를 사용하면 Network 상의 데이터들을 쉽게 엿볼 수 있게 되었다.
    • 평서문으로 전달한다면 제 3자가 모든 내용을 확인할 수 있다.

 

📌 To-be

https://medium.com/@jamessoun93/ssh%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%EC%9A%94-87b58c521d6f

  • 시큐어 셸(SSH, Secure Shell)은 송신자는 패킷을 전송 직전 암호화하고, 수신자는 받자마자 복호화를 하는 것이다. 
  • SSH는 일련의 과정을 아주 빠르고, 눈에 띄지 않게 수행하여 속도 측면의 저하를 느끼기 힘들다.
  • 최근에는 22번 포트를 이용한 SSH가 사실상 업계 표준이다.

 


2. OpenSSH

 

우분투/데비안 PC에서는 dpkg 패키지 관리자로 패키지 설치 목록을 확인할 수 있다.

dpkg -s gedit

  • gedit 패키지의 Status를 보면 installed 되었음을 알 수 있다.
  • dpkg는 APT 시스템에 속한 소프트웨어 패키지들을 관리하고 상태를 확인한다.
  • 아직 설치하지 않은 패키지 정보가 궁금하다면 apt search <패키지명>으로 확인한다.

 

https://velog.io/@hyeseong-dev/%EB%A6%AC%EB%88%85%EC%8A%A4-ssh%EB%9E%80

dpkg -s openssh-client
dpkg -s openssh-server

 

 

[Linux] Issue : Waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend

openSSH 명령어 실행을 위해서 sudo apt install openssh-server를 입력했더니 제목과 같은 에러가 발생했다. 문제의 원인을 알아보니 dpkg 패키지 관리 도구가 여러 프로세스 간에 동시 실행되려 할 때 생긴

jaeseo0519.tistory.com

만약 해당 패키지가 없으면 설치해주어야 하는데, 이슈가 발생하면 위 게시글을 참고하면 된다.

  • openssh-client 패키지의 모든 도구는 openssh-server에 포함된다.
  • 보안 모범 사례에 따르면 인프라에 대한 접근 경로는 절대적으로 필요한 곳으로 제한해야 한다.
    • 데스크톱이나 노트북으로 로그인할 필요가 없다면 openssh-client만 설치하면 된다.

 

systemctl status ssh

systemctl start ssh
systemctl stop ssh

systemctl enable ssh
systemctl disable ssh

  • systemctl status ssh로 패키지가 제대로 실행되는지 확인할 수 있다.
  • status 대신 start/stop으로 SSH 실행을 끄고 켤 수 있다.
  • enable, disable은 부팅될 때 자동 실행 여부를 설정한다.

 


3. SSH로 Remote Server Login

 

나는 Linux 환경의 Virtual Box에서 server를 열고, Window 환경의 Local 단에서 접속을 할 예정이다.

ipconfig/all

ipconfig/all을 하면 Ethernet adapter 이더넷 2가 VirtualBox라는 것을 알 수 있다.

여기에 IPv4 정보가 필요하다.

 

ip addr # VM에서

포트 포워딩을 위해서 Network - Port Forwarding을 선택한다.

연결에 필요한 정보들을 입력을 하고 확인을 누른 뒤 VM을 재실행 한다.

 

ssh (계정명)@(server ip 주소)

바보같이 root로 로그인을 시도하려고 했는데, 여튼 처음 접속할 때는 서버의 OpenSSH 프로그램이 보낸 정보가 맞는지 확인하고 yes를 입력해야 한다.

 

만약 위와 같은 화면이 보인다면 무사히 Server에 ssh 접속이 완료됐음을 의미한다.

 


4. non-password SSH 접근

 

📌 패스워드 방식의 단점
  • 대부분 너무 짧거나 추측하기 쉽고 또는 여러 계정에 반복해서 사용된다. 잊어버릴 일도 많다.
  • AWS같은 보안이 중요한 클라우드 인스턴스는 패스워드 인증을 기본으로 비활성화 해둔다.
    • PasswordAuthentication no

 

📌 OpenSSH 환경 설정 파일 
  • /etc/ssh/ : OpenSSH 설정 파일들이 모여있다.
  • /etc/ssh/sshd_config : 원격 클라이언트(remote client)가 서버 컴퓨터 로그인 방법을 제어하는 설정 파일
  • /etc/ssh/ssh_config : 사용자가 원격 호스트(remote host)에 client로서 로그인하는 방법을 제어하는 설정 파일

설정 파일에서 서버에 클라이언트가 로컬 프로그램들에 대한 GUI 접근 허용 여부 등에도 사용한다.

 

📌 패스프레이즈(passphrase)
  • 패스워드와 마찬가지로 사용자가 선택한 비밀 문자열
  • 공백과 일상단어들도 포함하므로, 길이가 길면서 상대적으로 기억하기가 쉽다.
  • 이상적으로는 키 쌍을 사용하기 전에 로컬 컴퓨터에서 passphrase를 생성하여 인증해야 한다.
  • Local OpenSSH 프로그램에 대한 사용자를 인증하기 위해 사용된다.

 

📌 새로운 키 쌍 생성하기
$ ssh-keygen

난 Window 환경이라 puttygen으로 생성했다.

생성된 key를 공유할 일이 있다면 key passphrase를 설정해 패스워드를 지정하는 방식도 좋다.

다만, 키를 사용할 때마다 패스워드를 입력해야하는 번거로움이 발생한다.

 

📌 네트워크를 통해 public key 복사

  • .ssh 폴더의 key
    • id_rsa : private key
    • id_rsa_pub : public key
    • authorized_keys : 접속 허용 서버 공개 키 (접속할 서버에 id_rsa.pub 추가)
  • 패스워드 없이 SSH 연결하려면 Host에 public key, Client에 private key가 있어야 한다.
# 원격 호스트의 완전한 SSH 쉘 세션을 열지 않고 접근하는 방법
$ ssh (계정명)@(ip 주소) mkdir -p .ssh

$ cat .\linux-study.pem | ssh yu21911407@192.168.56.1 "cat >> .ssh/authorized_keys"

  1. Client PC에서 public key, private key 쌍을 생성한다.
  2. public key를 Host PC에 전송한다.
  3. private key로 챌린지 메시지를 생성하고 서명한다.
  4. 메시지를 Host PC에 전송한다.
  5. Host PC에서 public key로 메시지를 검증하고 접근을 승인한다.

 

(이러면 이제 패스워드 입력 안 해도 된다는데 window에서 virtual box로 linux 돌리는 거라 안 되는 것 같다. 맥북으로 다시 해봐야지..)

 

📌 다중 암호화 
ssh -i .ssh/mykey.pem (계정)@(ip 주소)
  • AWS EC2 서비스의 VM에 로그인할 때처럼 특정 세션에 사용할 Key pair를 지정해야 하는 경우가 있다.
  • 특히 여러 호스트에 사용되는 일련의 키를 만들 때 이렇다.
  • -i 플래그 뒤에 개인 키 파일의 이름과 위치를 지정하면 된다.

 


5. SCP

 

https://phoenixnap.com/kb/linux-scp-command

  • 파일과 디렉토리를 복사할 때 cp 명령을 사용한다.
  • 네트워크를 통해 복사할 때도 이론상 cp 명령이 가능하지만 "완전히 정신 나간 짓"이다.
    • 복사할 때 Network에 연결된 사람들과 나중에 log 데이터를 검색하는 사람들에게 파일 내용이 노출된다.
  • S(secure)CP프로그램은 SSH 프로토콜을 사용하여 파일을 전송한다.

 

# 방법1. Host PC → Remote Host
$ scp .ssh/id_rsa.pub (계정명)@(ip주소):/home/ubuntu/.ssh/authorized_keys

# 방법2. Host PC → Remote Host
$ ssh-copy-id -i .ssh/id_ras.pub (계정명)@(ip주소)

# Remote Host(AWS EC2 Instance) → Host PC
$ scp -i myKey.pem (계정명)@(ip주소):/home/mylogin/backup-file.tar.gz ./backups/january/

사용중인 계정에 루트 권한이 없다면 etc 디렉터리 등에 파일을 복사하거나 저장할 수 없다. (그렇다고 SSH 세션에서 루트 사용자로 로그인하는 것은 보안상 위험한 행동이다)

 


6. Linux Process Control

 

📌 systemctl

(사진)

  • 소프트웨어 : 사람을 대신해 컴퓨터 하드웨어를 제어하는 명령을 담은 프로그램 코드
  • 프로세스 : 실행 중인 소프트웨어 프로그램의 인스턴스
  • OS : 컴퓨터 하드웨어 리소스를 효율적으로 사용하고자 인스턴스(프로세스)들을 정리하고 관리하는 도구
  • systemctl은 복잡한 Multi-process와 다중 사용자 환경에서 프로세스를 관리하는 교통 경찰 역할을 수행한다.

 

📌 ps : 프로세스 살펴보기
# 10초 동안 백그라운드(&)에서 아무것도 하지 않다가(sleep) 종료한다.
$ for i in {1..10}; do sleep 1; done &

$ ps

  • 첫 번째 명령으로 실행된 프로세스는 두 개가 있다.
    • [3945] bash shell과 [3948] sleep Process가 생겼다. 
    • 3949 : 실행 중인 Process들을 나열하는 ps 명령

 

$ ps

  • 10초 뒤에는 이전의 두 Process는 더 이상 볼 수 없다.
  • 대신 sleep 명령이 성공적으로 실행되었다는 메시지만 볼 수 있다.

 

$ ps

  • 일반적으로는 현재 셀 세션에서 사용하는 bash 명령 인터프리터의 프로세스와, 가장 최근에 실행한 명령(ps)의 프로세스 두 개만 보인다.
  • 그러나 bash의 PID는 3846이나 되는데, 그 이전에 돌아가는 Process가 아주 많다는 것을 알 수 있다.
  • 해당 프로세스들은 모두 부모 shell process가 만들었으며, 거슬러올라가다 보면 결국 init process에 도달한다.

 

💡 init Process는 우분투에서 Linux가 부팅할 때 가장 먼저 깨어 다른 Process들을 실행한다.

$ ps -ef | grep init
  • -e : 현재 shell이 실행한 Process뿐만 아니라 init 이후의 모든 부모 shell에서 실행된 process를 보여준다.

  • 해당 Process의 소유자는 root 사용자다.
  • '/sbin/init'에 Process를 만든 실행 파일의 위치와 이름이 나온다. 
  • PID 1을 받을 수 있는 유일한 방법은 다른 process보다 먼저 실행되는 것이다.

 

더보기

✒️ pstree

 

부모와 자식 shell/process를 시각화해서 보고 싶을 때 사용하면 된다.

-p 옵션을 지정하면 각 Process들의 PI도 확인할 수 있다.

PID 1이 할당된 첫 번째 Process가 systemd임에 주목하라.

 

📌 systemd (sytem daemon)

https://en.wikipedia.org/wiki/Systemd#/media/File:Systemd_components.svg

  • '/sbin/init' 파일의 재밌는 점은 실제 프로그램이 아니라 systemd라는 프로그램에 대한 심볼링 링크(symbolic link)라는 점이다. (리눅스 배포판에선 /lib/systemd/systemd)
  • 오랫동안 유닉스 기반 OS에서는 처음 실행하는 Process가 init이었으나, systemd가 대체했다.
    • 대체(drop-in replacement) : 실제로 수행하는 작업은 상당히 다르지만, init이 해왔던 일을 systemd가 대신한다
  • systemd의 역할
    • 주요 임무 : 개별 Process 생성, 유지, 종료하는 방법 제어
    • 로그 관리자(journald), 네트워크 관리자(networkd), 장치 관리자(udevd) 도구 포함
  • 데몬(deamon) : 백그라운드에서 실행되는 System Process (끝에 d가 붙은 관리자들은 모두 daemon)