ssh

Etc

0 views

기초

1. 개요 및 정의

1.1 한줄 요약

  • SSH는 Telnet의 취약한 통신에서 보안을 추가하여 안전한 원격 접속을 가능하게 해준다.

1.2 정의

  • SSH(Secure Shell)는 보안이 취약한 네트워크 상에서 안전하게 시스템을 관리하고 파일을 전송하기 위해서 설계된 네트워크 프로토콜이다.
    • OSI 7계층에서 애플리케이션 계층에서 동작하며 기본적으로 TCP 22번 포트를 사용한다.
    • 기존 Telnet이나 Rsh와 다르게 모든 데이터를 암호화하여 전송한다.

2. 동작 원리

  • 내부적으로 비대칭키와 대칭키 암호화 방식을 혼합한다.

2.1 간단한 분석

  1. 버전 교환
    • 클라이언트 서버는 서로 지원하는 SSH 프로토콜 버전을 교환하여 호환성을 확인한다.
  2. 키 교환 및 세션 키 생성
    • 공개키를 교환하지 않고 공용 비밀키를 생성하고 이후 모든 통신은 해당 키를 사용해서 비대칭 암호화 방식으로 이루어진다.
  3. 서버 인증
    • 클라이언트는 접속하려는 서버가 위조된 서버가 아닌지 확인해야 한다.
    • 최초 접속 시 클라이언트는 서버의 지문을 ~/.ssh/known_hosts 파일에 저장한다.
    • 이후 접속 시 저장된 정보와 대조하여 MITM 공격을 방지함
  4. 사용자 인증
    • 세션이 암호화된 터널을 통해 안전해지면, 서버는 클라이언트에게 접근 권한이 존재하는지 물어본다.
    • 이때 비밀번호 방식 또는 SSH 키 페어 방식이 사용된다.

3. 사용법 및 구문

  • 가장 널리 사용되는 OpenSSH 클라이언트를 기준으로 본다.

3.1 기본 접속 구문

ssh [옵션] [사용자명]@[호스트주소]

3.2 예시

  1. 기본 비밀번호 접속이 가장 일반적이다. (기본 22포트)

    ssh Swoo@192.168.1.21
    
    # 실행 후 Password 입력
    
  2. 특정 포트 지정 접속 (-p)

    ssh -p 2222 Swoo@Swoo.com
    
  3. 개인키를 이용한 접속 (-i)

    ssh -i /경로/Swoo-Key.pem Swoo@Swoo.com
    
  4. 디버깅 (-v)

    ssh -vv Swoo@Swoo.com
    
    # v의 개수에 따라 디버깅 상세도가 달라짐
    

3.3 기타

  • 보통 ssh 연결 방식을 추천한다.
    • 또한 Root 로그인 차단 비밀번호 인증 비활성화 설정을 해놓는게 좋고 포트도 22가 아닌 다른것을 사용하는 것이 좋다.
    • SSH 개인키 파일의 권한은 소유자만 읽을 수 있도록 변경하는 것이 좋다.

SSH 개인 키

1. 개요

  • SSH 개인키는 비대칭 암호화 방식인 공개키 기반 구조에서 사용자를 인증하기 위해 생성되는 비밀 파일이다.
    • 쌍을 이루는 공개키는 서버에 저장되어 자물쇠 역할을 하고 개인키는 클라이언트에 저장되어 그 자물쇠를 여는 열쇠 역할을 수행한다.

2. 동작 원리

  • SSH 접속 시 비밀번호를 입력하지 않아도 되는 이유는 내부적으로 ‘Challenge-Response’ 프로토콜이 작동하기 때문이다.

2.1 인증 프로토콜

  1. 접속 요청
    1. 클라이언트가 서버에 "나 접속할래, 내 공개키 ID는 이거야"라고 요청한다.
  2. 검증 준비
    1. 서버는 authorized_keys 파일에 해당 공개키가 있는지 확인한다.
  3. 챌린지(Challenge)
    1. 서버는 난수를 생성하여 클라이언트에게 보낸다. ("이 난수를 너의 개인키로 암호화(서명)해서 보내봐.")
  4. 서명(Signing)
    1. 클라이언트는 자신의 개인키를 사용하여 서버가 보낸 난수에 전자 서명을 하고, 이를 서버로 되돌려 보낸다.
  5. 검증(Verification)
    1. 서버는 가지고 있던 공개키로 클라이언트의 서명을 해독(검증)한다.
  6. 접속 허용
    1. 해독된 값이 처음에 보낸 난수와 일치하면, "진짜 열쇠를 가진 주인이 맞구나"라고 판단하고 접속을 승인한다.

3. 사용법 및 구문

3.1 키 생성 (Generate)

  • 가장 강력하고 권장되는 Ed25519 알고리즘을 사용하여 키를 생성한다.

    # -t: 타입(알고리즘), -C: 코멘트(주로 이메일)
    ssh-keygen -t ed25519 -C "admin@company.com"
    
  • 명령 실행 후, 키를 저장할 경로와 Passphrase(키 비밀번호)를 묻는다.

    • 보안을 위해 Passphrase 설정을 권장한다.

3.2 파일 구조

  • 생성된 키는 보통 ~/.ssh/ 디렉터리에 저장된다.
    • id_ed25519: 개인키. (절대 공개 금지)
    • id_ed25519.pub: 공개키. (서버의 ~/.ssh/에 등록)

3.3 접속 시 사용 (i 옵션)

  • 기본 경로(~/.ssh/id_rsa 등)가 아닌 다른 이름이나 경로의 키를 사용할 때는 -i 옵션을 쓴다.

    # ssh -i [개인키경로] [유저]@[서버주소]
    ssh -i ./my-secret-key.pem ubuntu@192.168.1.100
    

4. 주의

4.1 권한 설정

  • SSH 클라이언트는 개인키 파일의 권한이 너무 개방되어 있으면(타인이 읽을 수 있으면), 이를 보안 위협으로 간주하고 접속을 거부한다.
    • 필수 권한: 소유자만 읽기/쓰기 가능 (600)

    • 설정 명령어

      chmod 600 ~/.ssh/id_ed25519
      

SSH 접속 시 쉘 지정 및 변경

1. 개요

  • SSH 프로토콜을 통해 원격 호스트에 접속할 때, 서버의 /etc/passwd에 설정된 기본 로그인 셸 대신 사용자가 명시한 특정 셸(bash, zsh, fish 등)을 실행하여 세션을 시작하는 기술이다.

2. 동작 원리

  • 일반적으로 SSH 접속 시 서버는 사용자의 기본 셸을 실행한다.
    • 하지만 특정 명령어를 인자로 전달하면 동작 방식이 달라진다.

2.1. 일반 접속 vs 명령어 전달 접속

  1. 일반 접속 (ssh user@host):
    • 서버는 PTY(Pseudo-Terminal, 의사 터미널)를 할당한다.
    • 로그인 프로세스가 사용자의 기본 셸(예: /bin/bash)을 대화형(Interactive) 모드로 실행한다.
  2. 셸 지정 접속 (ssh user@host /bin/zsh):
    • SSH는 원격지에서 /bin/zsh라는 단일 명령어를 실행하려 한다.
    • 문제점: 기본적으로 이 방식은 PTY를 할당하지 않을 수 있어, 셸이 실행되자마자 종료되거나 프롬프트가 뜨지 않는 비대화형(Non-interactive) 상태가 된다.
    • 해결책: 클라이언트에서 t 옵션을 사용하여 강제로 PTY 할당을 요청해야 한다.

3. 사용법 및 구문

3.1. 일시적 셸 지정 (접속할 때만 변경)

  • 가장 많이 사용하는 방법이다.

    • 서버의 기본 설정을 바꾸지 않고 이번 접속에서만 다른 셸을 쓰고 싶을 때 사용한다.
  • 핵심 옵션: -t (Force pseudo-terminal allocation)

    중요: 이 옵션이 없으면 셸 프롬프트가 뜨지 않거나 화살표 키, 자동 완성이 작동하지 않는다.

    # 문법: ssh -t [사용자]@[호스트] [실행할 셸 경로]
    
    # 예시 1: bash로 접속 (서버 기본이 sh일 때 유용)
    ssh -t myuser@192.168.1.10 /bin/bash
    
    # 예시 2: zsh로 접속 (개인 설정이 있는 경우)
    ssh -t myuser@192.168.1.10 /bin/zsh
    
    # 예시 3: 로그인 셸처럼 동작하게 하려면 -l 옵션 추가 (설정 파일 로드)
    ssh -t myuser@192.168.1.10 "/bin/bash -l"
    

3.2. 영구적 셸 변경 (서버 설정 변경)

  • 매번 -t 옵션을 치기 귀찮다면, 서버에 접속한 후 아예 내 계정의 기본 셸을 바꿔버린다.

    # 1. 서버 접속
    ssh myuser@192.168.1.10
    
    # 2. 사용 가능한 셸 확인
    cat /etc/shells
    
    # 3. 기본 셸 변경 (Change Shell)
    # chsh -s [셸 경로]
    chsh -s /bin/zsh
    
    # 4. 로그아웃 후 재접속하면 zsh가 기본으로 실행됨
    

3.3. SSH Config 파일 활용 (자동화)

  • 로컬 컴퓨터의 ~/.ssh/config 파일에 설정을 저장하여, 명령어 입력 없이도 자동으로 특정 셸로 접속하게 만든다.

    # ~/.ssh/config 파일 수정
    
    Host myserver
        HostName 192.168.1.10
        User myuser
        RequestTTY force      # -t 옵션과 동일 (터미널 강제 할당)
        RemoteCommand /bin/zsh # 접속 시 실행할 명령어
    
  • 이제 터미널에서 ssh myserver만 입력해도 자동으로 zsh로 연결된다.


Loading comments...