본 포스팅은 Linux 환경에서 Git 서버를 구축하기 위한 기록입니다.
테스트 환경은 raspbian, ubuntu, arch입니다.
raspbian은 라즈베리파이에서 주로 사용하는 데비안 계열 운영체제로, Ubumtu와 명령어가 유사합니다.
따라서 본 포스팅에서는 Ubuntu와 Arch Linux 두 운영체제의 명령어를 같이 기록했습니다.
필요에 따라 선택해서 적용해주세요.
구분은 for Ubuntu, for Arch Linux로 각 운영체제에 따른 명령어를 명시했습니다.
별도의 구분이 없다면 공통으로 사용되는 명령어인 것이니 참고해주세요.
깃 서버는 git 명령어를 이용해 간단하게 구축이 가능합니다.
깃이란, 하나의 프로젝트를 여러 명이 각각의 컴퓨터에서 개발할 때 소스 코드의 생성, 변경하는 일이 비일비재하게 일어나는데, 이런 여러 명이서 작업할 때 생기는 문제점을 보완하기 위한 오픈 소스 형상 관리 도구입니다.
깃은 크게는 아래와 같은 상황이 발생했을 때를 위해 효과를 발휘합니다.
- 프로젝트를 개발용 버전, 상업용 버전 등으로 나누어 병렬로 개발해야 하는 경우 (branch)
- 같은 파일을 여러 명이서 작업했을 때 합치는 경우 (merge)
- 현재 작업하는 파일에 문제가 발생해서 과거의 파일로 되돌려야 하는 경우 (revert)
이외에도 다양한 기능을 수행합니다.
자세한 사항은 아래의 링크를 참조해주세요.
그럼 본격적으로 개인이 사용하고 있는 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
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
파일을 열었다면 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 서버 구축 포스팅을 마치겠습니다.
'Dev > linux' 카테고리의 다른 글
[Linux] vim 코드 자동완성 사용하기 (0) | 2020.12.08 |
---|---|
[Linux] 파일 접근 허가 상수 (0) | 2020.11.30 |
Linux에서의 Shell & crontab을 이용한 Mysql 데이터베이스 백업 (0) | 2020.09.27 |
[Linux] Ubuntu Linux - Virtual Box에서의 고정 IP 할당 (0) | 2020.09.22 |
[Linux] Install Arch Linux on Virtual Box (0) | 2020.09.10 |