본문 바로가기

정보/Dev

SSH, Shell과 Daemon

 

EC2 에서는 외부에서 public 서버 혹은 bastion을 사용해 private 서버로 접근하기 위해

SSH 를 사용한다. 그리고 이를 사용하기 위해 SSH 전용 포트인 22번 포트를 열어 놓는다.

그러면 SSH란 무엇이며 어떻게 사용하는 것인지,

그것과 관련한 기타 리눅스 관련 용어 및 개념들을 설명하고자 한다.

 

1. SSH?

"보안 셸(SSH) 프로토콜은 보호되지 않는 네트워크를 통해 컴퓨터에 명령을 안전하게 전송하는 방법입니다. SSH는 암호화를 사용하여 장치 간의 연결을 인증하고 암호화합니다. SSH는 또한 터널링  또는 포트 포워딩을 허용하는데, 이는 데이터 패킷이 다른 방법으로는 통과할 수 없는 네트워크를 통과할 수 있도록 하는 것입니다. SSH는 서버를 원격으로 제어하고, 인프라를 관리하며, 파일을 전송하는 데 자주 사용됩니다. "

 

Cloudflare에 설명이 너무 잘 되어 있어서 인용했다. 여기서 설명한 모든 문장이 의미가 있다.

  • "네트워크를 통해 컴퓨터에 명령을 안전하게 전송" : 네트워크를 통해서 명령(shell 명령)을 전달하는 것이다.
  • "보호되지 않는 네트워크" + "암호화를 사용하여 장치 간의 연결을 인증하고 암호화합니다." : 보호를 위해서는 암호화 수단이 필요하다. 
  • "터널링 또는 포트 포워딩을 허용" : 앞서 언급했듯이 Bastion 서버에서 활용 가능
  • "다른 방법으로는 통과할 수 없는 네트워크를 통과할 수 있도록 하는 것" : Bastion을 이용해 Private Subnet, Private instance에 접근하는 방식으로 사용한다.
  • "서버를 원격으로 제어, 인프라를 관리, 파일을 전송" : 맨 앞 문장의 paraphrasing, 구체적인 용례를 말하고 있다.

 

2. SSH 의 암호화 수단 - (1) 비대칭키를 이용하는 방식

 

SSH 암호화의 default 설정은 id, pw가 아닌 비대칭키 기반 전략이다.

ssh-keygen -t ed25519 -C "name@example.com"

shell, 혹은 bash에서 위와 같이 입력하면  ~/.ssh 디렉토리 안에 아래와 같이 공개키와 비공개키가 형성된다.

참고로 passphrase 를 묻는 과정이 있다. 해당하는 비대칭키를 사용할 때 비밀번호를 추가로 입력해야하는 과정인데,

비밀번호를 입력하지 않고도 사용되기 때문에 번거로움을 줄이려면 사용하지 않아도 된다. 

 

여기서 중요한 것은 누가 공개키를 가지고, 누가 비공개키를 가지는 것이냐 이다.

비공개키를 가질 대상은 접속을 시도하려는 대상인 내가 되어야 할 것이고,

공개키를 가질 대상은 접속을 받는 대상, 보통 서버가 될 것이다.

서버에게 scp를 통해서 id_ed25519.pub 파일을 복사한 후 /.ssh/authorized_keys의 파일 내용에 집어넣어준다.

 

 

3. SSH 의 암호화 수단 - (2) ID, PW 기반의 방식

 

이전의 ec2 과정에서도 한번 설정한 적이 있는데,

일단 현재 접속해있거나 사용하고자 하는 username의 pw를 설정하고,

그 후 sshd_config 의 설정을 pw 기반 접속을 허용하도록 하는 방식을 사용한다.

이에 대한 설명은 이전글에 나와 있기 때문에 이쪽을 참고하도록 하자.

추가적으로 설명하자면,

ec2를 만들 때 amazon linux기반의 인스턴스를 형성했다면 이전의 글의 설명만으로도 

id, pw를 통한 접근이 가능하다. https://namucy.tistory.com/57

 

하지만 ubuntu 기반의 ec2 서버를 만들었다면 조금 수정되어야 할 내용이 있다.

config 파일에 저 파일을 가지고 있는데,

저 파일도 마찬가지로 vi 를 통해 들어가보면 

이 값을 yes로 바꾸고 sshd 를 재시작해야한다.

 

이를 시작할 때 

sudo systemctl restart sshd

라는 명령어를 사용하는데, 이때의 명령어를 이해해보기 위해서

 

shell과 OS 관련된 지식에 대해 알아보고 가도록 하자.

 

 

4. OS 관련 지식

  • Kernel : 커널은 운영체제의 핵심인 소프트웨어이다. 수학에서의 kernel이 중요한 것 처럼
    운영체제에서 가장 중요한 것이 kernel이다. 
    https://en.wikipedia.org/wiki/Kernel_(operating_system)
  • 커널은 다음과 같은 기능을 한다.
    • 하드웨어와 소프트웨어 구성 요소 간 상호작용
    • 리소스(하드웨어, 소프트웨어) 간 충돌 중재
    • 자원 활용 최적화 (할당 및 회수)
  • 프로세스 : 프로그램에 자원이 할당되어 실행되고 있는 프로그램을 프로세스라 한다.
  • Daemon : 프로세스에는 Foreground process, Background process가 있다.
    • Foreground process : 명령이 실행된 상태에서 사용자가 다른 입력을 하지 못하는 프로세스
    • Background process : 명령을 실행한 상태에 터미널에서 다른 작업을 할 수 있는 프로세스
    • Linux에서는 시스템, 서비스 유지 관리용으로 설계된 Background process를 Daemon이라 하고, Window에서는 비슷한 개념을 Service라 한다.
    • 그리고 커널 부팅이 끝난 후 시작되는 초기화 시스템에서 다뤄지는 프로세스가 바로 초기화 프로세스이다.
      • Linux의 systemd, 윈도우의 Window Service Manager가 바로 초기화 프로세스이다.
      • 초기화 프로세스의 PID는 1이다.
    • 위의 명령어에서 systemctl은 daemon의 시작, 종료등을 관리한다.
  • Shell : 커널을 다루는 것은 힘들기 때문에 Kernel을 다루기 위해 주어지는 것이 Shell 이다.
    • 응용 소프트웨어(Application)으로 기본적으로 제공되는 Kernel을 다루는 도구이다.
    • systemd가 시작된 후 실행되는 것이 shell이다.
    • 위의 명령어에서 sudo는 substitute user do의 약어로 root계정이 실행하는 명령어를 뜻함.
  • SSH : SSH 는 네트워크 상으로 해당 객체의 shell에 접근하는 프로토콜이다.

 

 

https://www.cloudflare.com/ko-kr/learning/access-management/what-is-ssh/