Git

[GIt] submodule 을 사용하여 민감 정보 관리하기

KAispread 2023. 6. 28. 02:37
728x90
반응형

📑 개요

프로젝트에 사용되는 많은 민감 정보들이 있다. 예를 들어, AWS의 서비스와 연동하기 위한 Access Key, JWT의 secret key 와 같은 정보들은 보안상 절대 외부로 노출되어선 안된다. 특히, AWS의 access key를 git public repository에 업로드하게 될 경우 이를 악용하는 사람으로 인해 엄청난 비용을 감당해야 할 수도 있다.

그렇다고 민감 정보를 담고있는 파일만 git에 업로드하지 않고 관리한다면 새로운 서버에 배포할 때마다 민감 정보를 포함한 파일을 일일이 생성해주어야 한다. 또한, 해당 파일에 대한 형상관리도 불가능해진다.

이러한 문제를 git submodule을 통해 해결할 수 있다. git submodule을 통해 민감 정보를 포함한 파일을 submodule 에 저장하고 해당 모듈을 외부에 노출시키지 않는다면, public 으로 공개된 저장소라 하더라도 민감 정보를 외부에 노출시키지 않은 채 프로젝트를 관리할 수 있다.

 

 

🔸 Git submodule ?

submodule은 특정 repository 하위에 다른 repository를 마운트 하여 사용할 수 있게 해주는 도구이다. 

이때, 기존 프로젝트를 슈퍼 프로젝트 (super project) / 슈퍼 프로젝트에 추가할 다른 repository를 서브 모듈 (submodule)이라고 한다. 서브 모듈을 private repository로 생성하면 해당 repo에 대한 접근 권한이 없는 사용자는 서브 모듈에 있는 정보들을 볼 수 없는 상태가 된다.

슈퍼 프로젝트에 서브 모듈을 추가하면, 서브 모듈은 슈퍼 프로젝트에 하나의 package 형태로 생성되고 해당 package는 내부적으로 서브 모듈의 커밋을 가리키게 된다. 슈퍼 프로젝트는 현재 가리키고 있는 서브 모듈의 커밋 해시 값을 바탕으로 해당 커밋 시점의 코드를 가져오게 된다.

 

Preview

실습해볼 내용은 다음과 같다.

src/main/resource 에 서브모듈 추가

기존 프로젝트의 src/main/resource 경로에 jwt key 값을 가지고 있는 application-jwt.yml 파일을 서브 모듈에 업로드하고 외부 사람들은 해당 파일을 확인할 수 없도록 할 것이다.

 

 

🔸 private 저장소 생성

서브 모듈로 사용할 repository를 생성한다. 해당 저장소는 민감 정보를 포함하고 있기 때문에 외부에 노출하지 않을 목적으로 Private 저장소로 생성하자

 

서브 모듈을 관리할 디렉토리를 만들고, 다음의 코드로 서브 모듈에 숨길 파일을 업로드한다

# submodule 에 넣을 민감 정보 파일 생성
vim application-jwt.yml
# jwt:
#   secretKey: 2EA214FQ23..

# submodule repository 에 민감 정보 파일 추가 & remote
git init
git add application-jwt.yml
git commit -m "add jwt property file"

# submodule repository 와 remote
git remote add origin https://github.com/KAispread/server-submodule.git

# submodule의 main branch 로 push
git push origin release

 

저장소에 파일이 업로드된 모습

 

 

🔸 Submodule 추가

# 서브 모듈 추가
git submodule add <submodule 경로> <사용할 submodule 패키지 명>

서브 모듈을 추가할 프로젝트 경로로 들어간다. (src/main/resource 에 서브 모듈을 추가)

 

다음의 명령어로 앞서 생성했던 server-submodule 저장소를 서브 모듈로 프로젝트에 추가한다.

git submodule add https://github.com/KAispread/server-submodule.git secure
  • git submodule add 다음으로 submodule의 경로 submodule의 패키지 명을 지정해 주면 된다.
    (패키지명 생략 시, submodule repository 이름으로 생성됨)

 

성공적으로 서브 모듈이 추가되었다면 다음과 같이 secure 경로 아래에 서브 모듈로 지정한 저장소의 코드가 들어가게 된다.

 

 

🔧 변경사항 확인하기

서브 모듈을 추가하면 다음과 같이. gitmodules라는 파일과 server-submodule 저장소와 마운트 되어있는 secure라는 디렉토리가 생성된다. 

 

여기서 알고 가야 할 중요한 개념이 있다.

서브모듈 경로로 이동시 branch가 바뀌는 모습

서브 모듈은 슈퍼 프로젝트와 별개의 repository로 취급한다. 슈퍼 프로젝트는 단지, 서브 모듈의 특정 커밋을 가리키고 있을 뿐이다. 

이러한 메커니즘으로 인해 submodule의 경로에서 git 명령을 수행하면 submodule 저장소에 대해 명령이 수행된다.
따라서, 서브모듈의 변경 사항을 가져올 땐 기본적으로 submodule의 경로에서 git pull 명령을 수행해주어야 한다.
(더 편리하게 서브모듈의 변경 사항을 업데이트할 수 있는 방법이 존재한다.)

 

 

.gitmodules & 서브 모듈

서브 모듈을 추가하면 다음과 같이 2개의 파일이 추가된다.

 

.gitmodules는 submodule에 대한 정보를 담고 있는 파일이다. 해당 정보를 바탕으로 슈퍼 프로젝트가 서브 모듈을 관리하게 된다. 이 파일에서 서브 모듈이 추가될 경로와 서브 모듈의 url, 브랜치 등을 설정할 수 있다. 

 

앞서, 슈퍼 프로젝트에서는 서브 모듈에 대한 커밋을 가리키고 있다고 했다. 슈퍼 프로젝트는 서브 모듈 자체를 하나의 커밋 해시 값으로 가지고 있기 때문에 어떤 커밋 값을 가리키고 있는지 저장소에 push 해주어야 한다. 

 

 

github 에서 보여지는 모습

위 두 파일을 메인 브랜치에 푸시하면 github 상에서는 다음과 같은 아이콘으로 보이게 된다. 앞서 생성한 저장소가 private 하기 때문에 일반 사용자들은 해당 디렉터리에 접근할 수 없다.

또한, 서브모듈 패키지 명 뒤에 현재 브랜치가 가리키고 있는 서브모듈의 커밋 값이 나타나게 된다. 이후에 서브모듈에 대한 변경 사항이 있다면 최신 커밋을 가리키도록 업데이트해주어야 한다.

 

 

🔹 Submodule 업데이트

# 서브모듈 업데이트
git submodule update --remote

앞서 서브 모듈로 추가한 저장소에 application-source.yml 파일을 추가했다.

 

앞서 말했던 것처럼, 슈퍼 프로젝트와 서브 모듈은 다른 저장소로 취급하기 때문에 git pull 명령으로는 서브 모듈의 변경 사항을 가져올 수 없다.

서브 모듈을 업데이트하기 위해선 슈퍼 프로젝트가 가리키고 있는 해시 값을 변경해주어야 한다. 다음의 명령을 통해 서브 모듈을 업데이트할 수 있다.

git submodule update --remote

git submodule upate --remote 명령 입력 시 최신 커밋의 해시값으로 checkout 하게 된다. 이를 통해 서브 모듈에 추가된 변경 사항을 가져올 수 있게 되는 것이다.

 

application-source.yml 파일이 가져와진 모습

 

 

remote branch에 서브 모듈 커밋 업데이트

서브 모듈을 업데이트하고 나서, 현재 remote 되어있는 원격 브랜치에도 슈퍼 프로젝트가 다른 커밋을 가리키도록 업데이트해주어야 한다.

git add src/main/resources/secure
git commit -m "add secure property"
git push origin

 

다음과 같이 서브 모듈의 최신 커밋 해시값을 가리키고 있는 것을 확인할 수 있다.

 

 

🔹 프로젝트 clone 시 submodule 까지 가져오기

git clone --recurse-submodules https://github.com/KAispread/server-submodule.git

일반적으로 사용하는 git clone ~ 명령을 사용하면 서브 모듈 코드까지 받아올 수 없다.
--recurse-submodules 옵션을 추가해야 서브모듈까지 가져올 수 있다.

 

 

참고

 

728x90
반응형