[Git] SSH

Dev.Hammy·2023년 9월 23일
0

Etc

목록 보기
5/20

SSH 키 생성 및 등록:

  • 사용자는 로컬 컴퓨터에서 SSH 키 쌍을 생성할 수 있습니다. 키 쌍은 ssh-keygen 명령을 사용하여 생성할 수 있습니다.
  • 생성한 SSH 공개 키를 GitHub 웹사이트에서 GitHub 계정 설정 페이지의 SSH and GPG keys 섹션에 등록합니다.
  • 이제 사용자는 GitHub 저장소를 SSH 프로토콜로 클론하고 코드를 푸시할 수 있습니다.

(1) ssh-keygen

# 터미널에서 명령을 실행할 때 기본적으로 id_rsa 파일이 생성됩니다. 이 파일은 개인 키입니다.
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

ssh-keygen 명령어는 SSH (Secure Shell) 키 쌍을 생성하고 관리하는 도구입니다.

  • ssh-keygen: SSH 키 쌍을 생성하는 명령어입니다.

  • -t: 사용할 알고리즘을 지정하는 옵션입니다.

    • ed25519 :
      • 권장되는 키 타입: 현재까지 가장 안전한 SSH 키 타입 중 하나로 여겨집니다.
      • 안전성: 높은 보안 수준을 제공하며, 많은 공격 유형에 대한 내성이 있습니다.
      • 호환성: 모던 시스템 및 서비스에서 기본적으로 지원되며, 대부분의 상황에서 사용할 수 있습니다.
    • rsa :
      • 전통적인 키 타입: 오래된 SSH 키 타입 중 하나로, 여전히 널리 사용됩니다.
      • 안전성: 보안 수준은 여전히 높지만, 일부 보안 업데이트를 거쳐야 할 수도 있습니다.
      • 호환성: 모든 SSH 클라이언트 및 서버에서 지원되므로 특별한 경우가 아니면 호환성 문제는 발생하지 않습니다.
  • -b 4096: 생성할 RSA 키의 비트 수를 지정하는 옵션입니다. 4096 비트로 매우 안전한 키를 생성하겠다는 것을 나타냅니다.

  • -C "your_email@example.com": 키 주석(comment)으로 사용될 문자열을 지정하는 옵션입니다. 일반적으로 사용자의 이메일 주소나 다른 설명 정보를 넣습니다.

  • Enter file in which to save the key라는 문구는 생성된 SSH 키를 어떤 파일에 저장할 것인지에 대한 사용자 입력을 요청하는 부분입니다. 키를 특정 프로젝트 또는 서버에 사용할 목적으로 다른 파일에 저장하고 싶다면 원하는 경로와 파일 이름을 입력하면 되고, 그냥 Enter를 누르면 홈 디렉토리 아래의 .ssh 디렉토리에 저장됩니다.

    • ~/.ssh/id_rsa : 개인 SSH키. 안전한 장소에 보관하여 SSH 연결에 사용
    • ~/.ssh/id_rsa.pub : 공개 SSH키. 다른 시스템 또는 서버에 복사하여 SSH 연결을 설정하는 데 사용
  • Enter passphrase (empty for no passphrase): SSH 개인 키에 대한 암호를 설정하라는 메시지입니다. 개인 키에 접근하려는 시도가 있을 때 암호를 요구하며, 이를 설정함으로써 보안을 강화할 수 있습니다.

    • 암호를 설정하려면 원하는 암호를 입력하고 Enter 키를 누릅니다. 암호를 입력할 때 화면에 아무것도 나타나지 않으므로 주의하세요.
    • 암호를 확인하기 위해 다시 동일한 암호를 입력하고 Enter 키를 누릅니다. 암호가 정확하게 입력되었는지 확인됩니다.
    • 암호가 설정되면 해당 암호를 사용하여 SSH 키를 사용할 때마다 암호를 입력해야 합니다.
    • 만약 암호를 설정하고 싶지 않다면, empty for no passphrase 메시지에 나와 있는 대로, 암호를 설정하지 않고 그냥 Enter 키를 누르면 됩니다. 이 경우에는 암호 없이 SSH 키를 사용할 수 있습니다.

(2) 키 생성 확인


randomart image는 기억하거나 저장할 필요 없습니다. 다만 fingerprint는 아래와 같은 이유로 보관하도록 합니다.

  • 키 신뢰성 확인: 다른 사람에게 SSH 공개 키를 전달할 때, 그 키의 fingerprint를 함께 제공하여 정확한 키인지 확인할 수 있습니다.
  • 보안 검사: 중요한 서버나 시스템에 연결할 때 fingerprint를 사용하여 해당 시스템의 정당성을 확인할 수 있습니다. SSH 연결 시 서버의 fingerprint를 비교함으로써 중간자 공격을 방지할 수 있습니다.
  • 키 복원: 키를 분실하거나 재설정해야 할 때 fingerprint를 사용하여 이전의 키를 식별하고 복원할 수 있습니다.

(3) GitHub에 생성한 SSH 키 등록하기

인증에 사용할 공개키 파일(.ssh/id_rsa.pub)의 내용을 복사하여 Key에 붙여넣기 후 Add SSH key 버튼을 클릭하면 인증키가 등록된다.

SSH 클라이언트, 서버, 에이전트

  • SSH 클라이언트 : 원격 서버에 연결하고 원격 시스템에 명령을 실행하는 주체. 원격 서버에 연결 시 서버에 대한 인증 제공
  • SSH 서버 : 클라이언트의 연결을 수락하고 인증된 사용자에게 원격 접근을 허용하고 권한을 관리
  • SSH 에이전트 : SSH 키 관리 및 SSH 연결 중재를 수행. 주로 클라이언트 시스템에서 실행됨.

(1) 다수의 SSH클라이언트, 서버를 사용하는 경우

  • 개발 환경 분리: 개발자들이 여러 프로젝트에 참여하고 있는 경우, 각 프로젝트를 위한 개발 환경을 분리하기 위해 다른 SSH 클라이언트 및 서버 인스턴스를 사용할 수 있습니다. 각 프로젝트의 원격 Git 저장소에 접근하거나 배포 서버에 연결할 때 다른 SSH 클라이언트를 사용하여 작업을 분리할 수 있습니다.

  • 보안 계층 구분: 보안 계층을 분리하려는 경우, SSH 클라이언트와 서버를 별도로 실행할 수 있습니다. 예를 들어, 내부 네트워크와 외부 네트워크 간에 다른 수준의 보안이 필요한 경우, 내부 네트워크에서만 사용되는 SSH 서버와 외부에서 접속 가능한 다른 SSH 서버를 구성할 수 있습니다.

  • 다중 계정 관리: 서로 다른 SSH 계정을 관리하거나 다른 신원을 사용하여 원격 서버에 연결해야 하는 경우, 각 계정 또는 신원에 대한 별도의 SSH 클라이언트와 서버를 사용할 수 있습니다.

  • 포트 포워딩 및 터널링: SSH를 사용하여 포트 포워딩이나 터널링을 설정할 때, 다른 SSH 클라이언트 및 서버를 사용하여 여러 개의 터널을 동시에 관리할 수 있습니다.

  • 테스트 환경: 테스트 목적으로 다른 SSH 클라이언트와 서버를 실행할 수 있습니다. 이를 통해 다양한 테스트 시나리오를 시뮬레이션하고 테스트할 수 있습니다.

(2) 다수의 SSH 에이전트를 사용하는 경우

하나의 에이전트는 여러 개의 SSH 키를 관리하고 여러 서버에 연결할 수 있으므로 대부분의 상황에서는 하나의 에이전트로 충분합니다.

그러나 드물게 다음과 같은 특수한 상황에서 여러 개의 에이전트 세션이 필요할 수 있습니다:

  • 다른 사용자 또는 권한 분리: 서로 다른 사용자 또는 서로 다른 권한 수준을 가진 작업을 수행해야 할 때, 각각의 작업에 대한 별도의 에이전트 세션을 사용할 수 있습니다.

  • 서로 다른 키 관리: 여러 개의 에이전트를 사용하여 서로 다른 키 그룹을 분리하고 관리할 수 있습니다. 예를 들어, 업무용 키와 개인용 키를 분리하여 관리할 때에는 두 개의 에이전트를 사용할 수 있습니다.

  • 특수한 인증 방식: 특정 인증 방식을 위한 에이전트를 별도로 실행해야 하는 경우도 있습니다. 예를 들어, 특정 웹 사이트 또는 서비스에 대한 OAuth 토큰을 관리하기 위한 별도의 에이전트를 실행할 수 있습니다.

(3) SSH 클라이언트, 서버 및 에이전트 설치 / 실행

# ssh 클라이언트 버전 확인
ssh -V

# ssh 클라이언트 설치
sudo apt update
sudo apt install openssh-client

# ssh 서버 및 에이전트 설치
sudo apt install openssh-server

# ssh 에이전트 시작하고 환경변수 설정 스크립트 생성하여 현재 셸에 적용
eval "$(ssh-agent -s)"
  • 현재 셸 : 현재 사용 중인 명령 줄 환경 또는 터미널 세션을 의미합니다. 즉, 현재 사용자가 명령어를 입력하고 실행하는 터미널 창이나 셸 창을 가리킵니다. 각 터미널 창 또는 셸 창은 독립된 셸 환경을 가지며, 환경 변수 및 설정은 각각의 셸 세션(사용자 또는 프로그램이 시스템에 접속하여 작업을 수행하는 동안의 활동)에 적용됩니다.
  • ssh-agent -s : SSH 에이전트를 시작하고, 에이전트 정보를 출력합니다.
  • $(ssh-agent -s) : $() 부분은 명령어를 실행하고 해당 명령어의 표준 출력을 캡처합니다. 이 경우, SSH 에이전트 정보가 포함된 환경 변수 설정을 캡처합니다.
  • eval : 셸 스크립트 내에서 다른 명령어 또는 명령어의 출력을 실행하는 명령어입니다. 이 경우, SSH 에이전트를 시작한 후에 그 정보를 현재 셸에 적용하기 위해 eval을 사용하고 있습니다.

(4) 에이전트 실행 여부 확인하기

일반적으로 SSH 에이전트는 백그라운드에서 실행되며, ps 명령어로 볼 수 있는 프로세스 목록에 표시되지 않는 경우가 많습니다. 이는 에이전트가 시스템의 보안 및 인증 서비스를 수행하기 위해 데몬으로 실행되기 때문입니다.

# 숨겨진 백그라운드 프로세스도 목록에 포함하여 보여줌
ps -e
# 특정 프로세스 이름이나 패턴을 사용하여 프로세스 아이디 검색
pgrep ssh-agent
# ps 명령어의 출력을 grep을 사용하여 원하는 프로세스를 필터링
ps aux | grep ssh-agent
  • ps : 프로세스 정보를 출력
    • a: 현재 사용자와 관련 없이 모든 사용자의 프로세스를 표시
    • u: 사용자 이름, 프로세스 ID, CPU사용량, 메모리 사용량, 시작 시간 등을 포함한 자세한 사용자 정보 표시
    • x:터미널과 관련된 프로세스를 포함하여 모든 프로세스 표시

(5) SSH 키를 에이전트에 추가하기

# ssh 키를 에이전트에 추가하기. 여기서 ~/.ssh/your_private_key는 추가하려는 SSH 개인 키 파일의 경로임.
ssh-add ~/.ssh/your_private_key

SSH 설정 파일 만들기

~/.ssh/config 파일이 없으면 기본적으로 SSH는 시스템의 기본 설정을 사용합니다. 일반적으로 이러한 경우에도 SSH 작업을 수행할 수 있지만, ~/.ssh/config 파일을 사용하여 특정 호스트 및 키에 대한 사용자 정의 설정을 추가하면 더 많은 제어권을 얻을 수 있습니다.

# 터미널에서 파일을 생성
touch ~/.ssh/config

# 텍스트 에디터로 파일을 열고
nano ~/.ssh/config

# 원하는 호스트 및 키 설정을 추가 
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/your_private_key
  • Host: 호스트 별칭입니다. 이 부분은 실제 호스트 이름이나 별칭을 지정합니다.
  • HostName: 호스트의 실제 주소입니다.
  • User: 호스트에 연결할 때 사용되는 사용자 이름입니다. GitHub의 경우 일반적으로 "git"을 사용합니다.
  • IdentityFile: SSH 키의 경로를 지정합니다. ~/.ssh/your_private_key 부분을 실제 개인 키 파일의 경로로 바꿉니다.

SSH 프로토콜을 사용하는 git 주소에 연결

# 복제할 원격 저장소의 주소입니다. 이 주소는 GitHub에 있는 ashleydavis 사용자의 pnpm-workspace-examples 저장소를 가리킵니다.
git clone git@github.com:ashleydavis/pnpm-workspace-examples.git

이 주소는 SSH 프로토콜을 사용하고 있으며, 사용자 인증을 위해 SSH 키가 필요합니다.

  • The authenticity of host 'github.com (20.200.245.247)' can't be established.: 호스트 'github.com'의 신뢰성을 확인할 수 없습니다. 이 부분은 GitHub 서버의 주소와 호스트 이름을 나타냅니다.

  • ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.: ED25519 키 핑거프린트가 SHA256 해시 값으로 제공됩니다. 이 키 핑거프린트는 GitHub 서버에 대한 공개 키의 핑거프린트를 의미합니다.

  • This key is not known by any other names: 이 키는 다른 이름으로 알려져 있지 않습니다. 즉, 이 공개 키의 별칭이 없음을 나타냅니다.

  • Are you sure you want to continue connecting (yes/no/[fingerprint])?: 연결을 계속하려면 (yes/no/[fingerprint]) 중에서 선택하라는 질문입니다. 여기서 선택할 수 있는 옵션은 다음과 같습니다:

    • yes: 연결을 계속합니다.
    • no: 연결을 중단하고 복제를 취소합니다.
    • [fingerprint]: 지문 값을 직접 입력하여 지문을 확인하고 연결 여부를 결정할 수 있습니다.

"Fingerprint"를 입력하라는 메시지는 SSH 연결을 시도할 때 호스트의 신뢰성을 확인하는 중요한 보안 조치 중 하나입니다. 이 메시지는 다음 두 가지 이유 때문에 표시될 수 있습니다:

  1. 신뢰성 확인: SSH는 호스트 키를 사용하여 연결의 신뢰성을 확인합니다. 호스트 키는 호스트의 공개 키 지문(또는 지문)을 나타내며, 클라이언트(여기서는 Git 클라이언트)가 서버(여기서는 GitHub 서버)의 신뢰성을 확인하는 데 사용됩니다. 사용자가 이 호스트 키 지문을 확인하고 일치하는지 확인하면 중간자 공격을 방지할 수 있습니다.

  2. 보안 경고: 이 경고는 사용자가 연결하는 호스트가 처음 보는 호스트인 경우에 표시됩니다. 호스트 키를 확인하지 않고 연결을 계속하면 중간자 공격의 위험이 있습니다. 따라서 사용자는 호스트 키를 확인하고, 만약 지문이 일치하는 경우에만 연결을 계속해야 합니다.

    SSH 공개 키 지문(fingerprint)인 SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU는 공개해도 상관없는 정보입니다.

(1) yes 선택

SSH키 생성시 passphrase를 입력했다면 똑같이 입력해줍니다.
연결에 성공하여 로컬 레파지토리를 생성하였습니다.

(2) fingerprint 입력

상대방의 공개키 핑거프린트 SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU를 입력해도 연결할 수 있습니다.

(3) known_hosts 파일 생성

한번 인증에 성공하고 나면 known_hosts 파일이 .ssh 디렉터리 내에 생성되고 그 후 인증없이 ssh 연결을 할 수 있습니다.

SSH 공개키 인증에 실패했다면

오타가 나버려서 인증에 실패했고, 같은 명령어를 다시 입력해도 연결 거부 당합니다.

.ssh 디렉터리의 known_hosts 파일 지우기

known_hosts 파일을 삭제하니 다시 인증 절차를 진행할 수 있게 되었습니다.

0개의 댓글