본문 바로가기

Dev/linux

[Linux] Git 서버 구축

 

 

 

본 포스팅은 Linux 환경에서 Git 서버를 구축하기 위한 기록입니다.

테스트 환경은 raspbian, ubuntu, arch입니다.

raspbian은 라즈베리파이에서 주로 사용하는 데비안 계열 운영체제로, Ubumtu와 명령어가 유사합니다.

따라서 본 포스팅에서는 Ubuntu와 Arch Linux 두 운영체제의 명령어를 같이 기록했습니다.

필요에 따라 선택해서 적용해주세요.

 

구분은 for Ubuntu, for Arch Linux로 각 운영체제에 따른 명령어를 명시했습니다.

별도의 구분이 없다면 공통으로 사용되는 명령어인 것이니 참고해주세요.

 

깃 서버는 git 명령어를 이용해 간단하게 구축이 가능합니다.

 

깃이란, 하나의 프로젝트를 여러 명이 각각의 컴퓨터에서 개발할 때 소스 코드의 생성, 변경하는 일이 비일비재하게 일어나는데, 이런 여러 명이서 작업할 때 생기는 문제점을 보완하기 위한 오픈 소스 형상 관리 도구입니다.

 

깃은 크게는 아래와 같은 상황이 발생했을 때를 위해 효과를 발휘합니다.

 

  • 프로젝트를 개발용 버전, 상업용 버전 등으로 나누어 병렬로 개발해야 하는 경우 (branch)
  • 같은 파일을 여러 명이서 작업했을 때 합치는 경우 (merge)
  • 현재 작업하는 파일에 문제가 발생해서 과거의 파일로 되돌려야 하는 경우 (revert)

 

이외에도 다양한 기능을 수행합니다.

 

자세한 사항은 아래의 링크를 참조해주세요.

https://git-scm.com/about

 

About - Git

About Branching and Merging Small and Fast Distributed Data Assurance Staging Area Free and Open Source Trademark Branching and Merging The Git feature that really makes it stand apart from nearly every other SCM out there is its branching model. Git allow

git-scm.com

 

그럼 본격적으로 개인이 사용하고 있는 Linux PC에서 어떻게 깃 서버를 구축하는지 알아보겠습니다.

 

본 포스팅에서는 ssh-key를 이용한 비로그인 방식의 서버를 구축하겠습니다.

이 방식은 클라이언트의 public ssh-key를 관리자가 직접 추가를 해야 하기 때문에 ssh 로그인 방식보다는 안전하게 운영할 수 있습니다.

 

 

1. git & openssh-server 패키지 설치

# for Ubuntu =========================

$ sudo apt-get update
$ sudo apt-get install git
$ sudo apt-get install openssh-server

# ====================================

# for Arch Linux =====================
$ sudo pacman -Syu
$ sudo pacman -S git
$ sudo pacman -S openssh

# openssh 활성화
$ sudo systemctl start sshd
$ sudo systemctl enable sshd

# ====================================

 

 

2. git 접속용 사용자 생성

# for Ubuntu =========================

$ sudo adduser git

# ====================================

# for Arch Linux =====================

$ sudo useradd -m git
$ sudo passwd git #패스워드를 지정한다.

# ====================================

# 계정을 생성하면 /home 디렉터리에 git이라는 이름의 사용자 폴더가 생성된다.
# 폴더의 소유권을 git 유저에게 부여한다.
$ sudo chown git:git -R /home/git/

 

sudo adduser git 명령어를 수행했을 때, 생성된 git 사용자 폴더의 소유권이 root로 되어있는 경우가 있습니다.

이럴 경우 git 유저는 할 수 있는 것이 없기 때문에 폴더의 소유권을 git 계정에게 넘겨줍니다.

 

3. Client의 Public ssh-key를 저장하기 위한  authorized_keys 파일 생성

먼저, git 유저로 로그인 해 ssh-key를 보관할 디렉터리와 파일을 생성해야 합니다.

#git 유저로 로그인
$ su git
$ cd
$ mkdir .ssh

# .ssh폴더는 git 유저 외에는 사용할 일이 없고 사용해서도 안됩니다.
# 따라서 아래의 명령어로 폴더의 접근 권한을 변경합니다.

$ sudo chmod 700 .ssh

# Public SSH-KEY를 보관하기 위한 파일 생성

$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

 

다음으로 클라이언트 측에서 ssh-keygen을 이용해 key를 생성해야 합니다.

외부 접속은 ip 포트 포워딩 등 본 포스팅에서 다루는 것 외에 해야 할 일들이 있기 때문에 편의상 로컬의 다른 사용자를 생성해서 내부 네트워크를 통해 접근하도록 하겠습니다.

 

# git 유저로부터 로그아웃
$ exit

# 클라이언트 유저 생성

# for Ubuntu =========================

$ sudo useradd git-cla

# ====================================

# for Arch Linux =====================

$ sudo adduser -m git-cla
$ sudo passwd git-cla # 패스워드 지정

$ ====================================

# git-cla 유저로 로그인
$ su git-cla

# .ssh 디렉터리 생성
$ cd
$ mkdir .ssh

# ssh-key를 rsa라는 방식으로 암호화 합니다.

$ ssh-keygen -t rsa

 

Enter file in whtch to save the key 문구에서 저장해야 할 위치가 /home/git/.ssh로 제대로 지정되었는지 확인합니다.

 

중간에 passphrase를 입력하라는 문구가 나옵니다.

생성할 ssh-key를 재차 암호화하기 위한 비밀번호입니다.

 

입력하면 보안은 더 강해지겠지만 생략해도 무방합니다.

다만 입력하게 되면 ssh-key를 요구하는 구간에서 passphrase를 요구하고 생략하면 묻지 않습니다.

 

과정이 완료되었다면 아래와 같은 화면을 보게 됩니다.

 

 

이제, 생성한 id_rsa.pub 파일의 내용을 git 계정의 .ssh/authorized_keys 파일에 기록해야 합니다.

외부 환경이라면 메일을 통해 전달하거나 FTP를 통해 전달받아야 합니다.

 

본 예제에서는 git 계정이 git-cla의 id_rsa.pub 파일을 획득했다고 가정하고 진행하겠습니다.

 

예제에서는 sudo cp 명령어를 통해 git의 유저의 사용자 경로인 /home/git/ 에 git-cla_id_rsa.pub 라는 이름으로 id_rsa.pub 파일을 이동해두었습니다. (파일의 이름은 변경해도 괜찮습니다.)

 

 

이제 이 git-cla_id_rsa.pub 파일의 내용을  ~/.ssh/authorized_key 파일에 기록하겠습니다.

기록이 완료되었다면 git-cla_id_rsa.pub 파일은 삭제해줍니다.

 

$ cat ~/git-cla_id_rsa.pub >> ~/.ssh/authorized_keys
$ rm ~/git-cla_id_rsa.pub

 

authorized_keys에 클라이언트의 공개 키를 등록한다.

 

4. git 저장소 생성

git 유저에 로그인되어 있는 상태에서 아래의 명령어를 입력합니다.

# 저장소로 사용할 폴더 생성
$ cd
$ mkdir project.git

# 깃 저장소로 초기화
$ git init --bare project.git/

# 깃 계정 로그아웃
$ exit

 

이제 서버 측은 준비가 완료되었습니다.

 

5. 보안을 위한 git 계정의 shell 권한 제한

git 계정은 깃 서버로서의 역할 외에는 해야 할 일이 없습니다.

만약 배쉬 사용 권한을 제한하지 않으면 git 계정으로 ssh에 접근하는 유저들이 서버의 파일들을 조작할 수 있어서 보안상 바람직하지 않으므로 shell 실행 권한을 제한하도록 하겠습니다.

 

아래의 명령어로 /etc/passwd 파일을 열어 줍니다.

$ sudo vim /etc/passwd

 

/etc/passwd 파일 내 git 유저 정보

파일을 열었다면 git 유저 정보를 찾고, 다음과 같이 변경합니다.

# [수정 전]
git:x:1002:1002:,,,:/home/git:/bin/bash

# [수정 후]
git:x:1002:1002:,,,:/home/git:/bin/git-shell

1002:1002는 유저 ID와 그룹 ID 이므로 환경에 따라 다릅니다.

 

위와 같이 이제 로그인을 시도하면 git 유저의 접근이 불가능합니다.

앞으로 새 저장소가 생길 때는 root 권한으로 생성해서 git에게 소유권을 주는 방식으로 진행해야 합니다.

다소 절차가 번거로워졌지만 보안을 위해서는 감내해야 할 부분인 것 같습니다.

 

다음의 명령어를 통해 클라이언트 유저인 git-cla로 로그인합니다.

$ su git-cla
$ cd

 

먼저, 클라이언트가 깃을 사용하기 위해서는 사용자 등록을 해야 합니다.

아래의 명령어로 적당히 등록합니다.

$ git config --global user.name "YOUR NAME"
$ git config --global user.email "YOUR@EMAIL"

 

서버에서 생성한 깃 저장소를 clone 합니다.

$ git clone ssh://git@localhost:/home/git/project.git

 

명령어를 수행하면 위와 같이 신뢰성을 알 수 없는 연결인데 정말로 연결할 것이냐고 물어봅니다. 'yes'를 입력해 연결합니다.

 

성공적으로 저장소를 받아 왔습니다.

아직 저장소에 파일이 없기 때문에 경고문을 출력합니다.

 

시험 삼아 파일을 하나 만들고 커밋해보겠습니다.

$ cd project
$ touch README.md
$ git add .
$ git commit -m '최초 커밋'
$ git push

 

 

본래는 이 일련의 과정에서 암호를 요구해야 하지만, 클라이언트의 id_rsa.pub 키를 서버에 등록했기 때문에 암호를 요구하지 않고 있습니다.

 

git log 명령어를 이용해 추가한 파일이 형상관리가 되고 있는지 확인해 봅니다.

 

 

정상적으로 커밋이 된 것을 확인했습니다.

 

이것으로 Ubuntu & Arch Linux에서의 ssh-key를 이용한 git 서버 구축 포스팅을 마치겠습니다.