소개
SVN(Subversion)은 Apache 프로젝트에서 제공하는 버전 관리 시스템입니다. 소스 코드, 문서, 구성 파일 등 파일의 변경 이력을 추적하고 여러 사용자가 협업하기에 적합합니다. 이 가이드는 CentOS 환경에서 Apache를 통해 HTTP로 SVN 저장소를 서비스하고, 사용자·그룹별 접근 제어(Authz)를 설정하는 전체 흐름을 설명합니다.
정의: Subversion은 중앙형 버전 관리 시스템이다. 중앙 서버에 저장소를 두고 클라이언트가 체크아웃·커밋한다.
중요: 이 문서는 예제로 CentOS 6.4를 사용합니다. 다른 배포판이나 최신 버전에서는 패키지 이름, 디렉토리, 기본 설정 파일 위치가 다를 수 있습니다.
주요 목적 및 관련 검색 의도
- 기본 목적: CentOS에 SVN 서버 설치 및 HTTP 기반 접근 설정
- 관련 의도(variants): SVN 서버 구성, Subversion 권한 관리, mod_dav_svn 설정, TortoiseSVN로 클라이언트 테스트, SVN 보안 권장사항
1. 예비 사항
필수 조건:
- CentOS 루트 권한
- 네트워크에서 접근 가능한 고정 IP (예: 192.168.43.101)
- 방화벽에서 포트 80(또는 HTTPS 443) 허용
- yum 또는 패키지 관리자 접근
이 문서는 예시 IP 192.168.43.101을 사용합니다. 환경에 맞게 IP를 바꾸세요.
팁: 실서비스라면 HTTP 대신 HTTPS(SSL/TLS)를 사용하세요. 인증 정보와 트래픽을 암호화하려면 반드시 TLS를 적용해야 합니다.
2. 패키지 설치
이 섹션은 원문에서 소개한 설치 절차를 한국어로 번역 및 정리한 것입니다. CentOS의 yum을 사용해 httpd, subversion, mod_dav_svn을 설치합니다.
명령어 예시(원문에서 제공한 출력 포함):
ifconfig
(출력 예시)
[root@SVNSVR641 ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:61:E4:88
inet addr:192.168.43.101 Bcast:192.168.43.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe61:e488/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4640 errors:0 dropped:0 overruns:0 frame:0
TX packets:6845 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:444461 (434.0 KiB) TX bytes:549473 (536.5 KiB)
httpd 설치:
yum install -y httpd
(설치 로그 예시 생략 가능)
Subversion 설치:
yum install -y subversion
mod_dav_svn 설치:
yum install -y mod_dav_svn
참고: 다른 웹서버(nginx, lighttpd 등)를 쓰려면 Apache 대신 적합한 모듈/설정으로 대체해야 합니다. CentOS의 기본 예제는 Apache(httpd)용입니다.
3. SVN 저장소 생성 및 기본 구성
아래 단계는 저장소를 /data/svn에 생성하고, repo1이라는 저장소를 만들며 Apache(웹서버) 소유로 설정합니다. 이렇게 하면 Apache가 HTTP 요청을 처리할 때 저장소 파일에 접근할 수 있습니다.
저장소 디렉터리 생성:
mkdir /data/svn
저장소 생성 및 소유자 변경:
svnadmin create /data/svn/repo1
chown -R apache:apache /data/svn/repo1
저장소 루트에 기본 파일과 디렉터리가 생성됩니다.
cd /data/svn/repo1
ls
(예시 출력)
[root@SVNSVR641 repo1]# ls
conf db format hooks locks README.txt
conf 디렉터리 내부에는 인증 및 권한 관리 파일이 있습니다.
cd conf/
ls
(예시)
[root@SVNSVR641 conf]# ls
authz passwd svnserve.conf
svnserve.conf (저장소 로컬 설정 예시):
vi svnserve.conf
파일 내용 예시:
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
이 예시는 기본적으로 익명 접근을 차단하고, 인증된 사용자는 쓰기 권한을 가질 수 있도록 설정합니다. (실제 HTTP 접근 제어는 Apache 설정에서 처리합니다.)
사용자 계정 만들기 (passwd)
SVN 저장소용 사용자 계정은 conf/passwd 파일에 저장됩니다. 원문은 htpasswd 유틸리티를 사용해 암호 해시를 생성합니다.
첫 사용자 생성(파일 새로 만들기):
htpasswd -c /data/svn/repo1/conf/passwd jay
추가 사용자:
htpasswd /data/svn/repo1/conf/passwd fikri
htpasswd /data/svn/repo1/conf/passwd farid
예시 passwd 파일:
[root@SVNSVR641 conf]# cat passwd
jay:14hCNCmBZY/qA
fikri:/hlooqJMfYLkw
farid:P7Zvu6B3HyFGo
주의: htpasswd는 Apache HTTP 기본 Auth용 해시를 생성합니다. 파일에 저장되는 해시는 복호화할 수 없지만, 평문 암호가 아닌 해시로 저장됩니다. 실서비스에서는 LDAP/AD 연동 또는 중앙 인증을 고려하세요.
권한 파일 설정(authz)
authz 파일에서 저장소 경로별로 사용자 권한을 지정합니다. 예:
vi authz
파일 내용 예시:
[repo1:/]
farid = r
fikri = rw
* =
설명:
- farid: 읽기 전용
- fikri: 읽기/쓰기
- wildcard(*) 또는 그 외 사용자: 권한 없음
이제 Apache 쪽에서 저장소를 공개하도록 설정합니다.
Apache 구성
httpd.conf에 conf.d 디렉터리 포함 확인(없으면 추가):
Include conf.d/*.conf
/etc/httpd/conf.d/subversion.conf 파일을 편집하여 저장소를 매핑합니다.
vi /etc/httpd/conf.d/subversion.conf
예시 내용:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
DAV svn
SVNPath /data/svn/repo1
Authtype Basic
AuthName "My Repository"
AuthzSVNAccessFile /data/svn/repo1/conf/authz
AuthUserFile /data/svn/repo1/conf/passwd
Require valid-user
- Location /repo1 URL은 http://<서버>/repo1로 접근할 수 있게 합니다.
- AuthUserFile에서 사용자 목록을 사용합니다.
- AuthzSVNAccessFile에서 경로별 권한을 확인합니다.
변경 반영을 위해 Apache 재시작:
service httpd restart
(예시 출력)
[root@SVNSVR641 conf.d]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
4. 클라이언트에서 테스트
원문에서는 CentOS 데스크톱(리눅스)과 Windows(TortoiseSVN) 두 클라이언트에서 테스트하는 방법을 보여줍니다. 여기서는 순서대로 요약합니다.
4.1 리눅스 클라이언트로 체크아웃
클라이언트에 subversion 설치:
yum install -y subversion
작업 디렉터리 생성 및 체크아웃:
mkdir repo_client
svn co http://192.168.43.101/repo1 repo_client
인증 프롬프트에 사용자 fikri와 암호 입력. 처음에는 암호를 평문 저장할지 묻습니다(권장: 암호 저장을 제한하거나 암호화 저장을 구성).
체크아웃 후 디렉터리 구조:
[root@TEST01 repo_client]# ls -a
. .. .svn
읽기/쓰기 확인: 디렉터리 생성 후 커밋
cd repo_client/
svn mkdir first_dir
svn commit -m "My first folder"
커밋 성공 메시지 예:
Committed revision 1.
4.2 Windows(브라우저) 접근 테스트
브라우저로 http://192.168.43.101/repo1 접속 시 인증 창이 뜹니다.
JAY로 로그인하면 권한이 없으므로 접근 거부 화면을 볼 수 있습니다.
4.3 Windows(TortoiseSVN)로 체크아웃 및 권한 테스트
TortoiseSVN 설치 후, 새 폴더(testSVN)를 만들고 우클릭 → SVN Checkout 수행. 리포지토리 URL 입력 후 인증 창에서 farid로 로그인.
체크아웃 성공 화면 예:
로컬에서 first_dir이 보이며, farid가 읽기 전용이므로 서버에 변경 사항을 푸시하면 권한 거부가 발생합니다. Windows에서 새 폴더(second_dir)를 만든 뒤 TortoiseSVN → Add → Commit을 시도하면 권한 거부 스크린샷과 같이 실패합니다.
인증 창(사용자 farid 입력) 후 권한 거부 오류:
결과: 권한 설정이 의도대로 동작함을 확인했습니다.
보안 권장사항
- HTTPS 적용
- Apache에 SSL/TLS 인증서를 적용해 트래픽을 암호화하세요. Let’s Encrypt 같은 무료 CA를 고려할 수 있습니다.
- 암호 저장 정책
- Subversion 클라이언트는 기본적으로 평문 저장을 경고합니다. /root/.subversion/servers 파일에서 store-plaintext-passwords 옵션을 관리하거나 운영 기준에 따라 저장을 금지하세요.
- 인증 중앙화
- 규모가 커지면 htpasswd 대신 LDAP/Active Directory 또는 Kerberos를 사용해 인증을 중앙화하세요.
- 최소 권한 원칙
- 사용자에게 필요한 최소 권한만 부여하세요. Authz 파일을 통해 경로 단위 권한 적용을 권장합니다.
- 로그 감사
- Apache 및 SVN 로그를 주기적으로 수집하고 분석하세요. 이상 접근 시 빠른 대응이 가능합니다.
- 백업
- SVN 저장소 데이터와 hooks, conf를 정기적으로 백업하세요.svnadmin dump 명령으로 원자성 있게 백업할 수 있습니다.
운영 체크리스트 (관리자용)
- 서버 패키지 최신화(yum update)
- Apache와 mod_dav_svn 모듈 존재 확인
- /data/svn 권한: apache 소유 및 적절한 퍼미션
- conf/passwd와 conf/authz 파일 백업
- TLS 인증서 설치 및 만료일 확인
- 방화벽에서 서비스 포트 허용
- 로그 순환(logrotate) 설정 확인
역할별 핵심 체크리스트
- 관리자: 저장소 생성, 백업, 권한 관리
- 개발자: 체크아웃/커밋 규약 준수, 주기적 업데이트
- 보안 담당: 접근 로그·감사, TLS 정책 적용
수용 기준
이 서버를 운영 환경에 배포하기 위한 최소 수용 기준은 다음과 같습니다.
- Apache가 정상적으로 시작되고 /repo1 URL로 접근 시 인증창 노출
- fikri로 체크아웃, 디렉터리 생성, 커밋이 정상 동작(읽기/쓰기)
- farid로 체크아웃은 가능하나 커밋 시 권한 거부(읽기 전용)
- jay로는 리포지토리 목록 조회 불가(권한 없음)
- 저장소 데이터와 conf 파일을 복원 가능한 백업이 존재
테스트 케이스(간단)
- TC1: fikri로 체크아웃 및 커밋 -> 성공
- TC2: farid로 체크아웃 -> 성공
- TC3: farid로 커밋 -> 실패(권한 거부)
- TC4: jay로 접속 -> 접근 거부
문제 해결 가이드
문제: 저장소에 접속 시 403 Forbidden
- 확인사항:
- Apache의 error_log에서 관련 에러 확인(/var/log/httpd/error_log)
- AuthzSVNAccessFile 경로가 정확한지 확인
- SVNPath가 올바른 디렉터리를 가리키는지 확인
- 파일 및 디렉터리 소유권이 apache:apache인지 확인
문제: 인증 창이 뜨지 않음 또는 모듈 로드 실패
- 확인사항:
- mod_dav_svn.so 및 mod_authz_svn.so가 모듈 디렉터리에 존재하는지 확인
- httpd.conf에 Include conf.d/*.conf가 있는지 확인
- service httpd restart 후 에러 로그 확인
문제: 클라이언트가 암호를 저장하지 못함(경고 메시지)
- 원인: 클라이언트가 평문 저장 여부를 묻는 메시지입니다. /root/.subversion/servers의 store-plaintext-passwords 값을 조정하거나 클라이언트 측 암호 저장 정책을 변경하세요.
확장: 마이그레이션 및 대안
- Git으로의 마이그레이션: SVN을 Git으로 옮길 때는 svn2git 또는 git-svn 도구를 사용합니다. 이 과정에서 브랜치·태그 매핑, 메타데이터(작성자, 날짜) 보존 여부를 확인하세요.
- 대안 버전관리: 분산형인 Git이 현재 표준으로 자리합니다. 새로운 프로젝트라면 Git을 우선 검토하세요. 기존 중앙형 워크플로가 필요하거나 레거시 툴과의 호환성이 중요하면 SVN 유지가 합리적입니다.
운영용 미니 SOP (요약 플레이북)
- 패키지 설치: httpd, subversion, mod_dav_svn 설치
- 저장소 생성: svnadmin create /data/svn/
- 소유권 변경: chown -R apache:apache /data/svn/
- 사용자 추가: htpasswd -c conf/passwd
(초회), htpasswd conf/passwd - 권한 설정: conf/authz에 경로별 권한 명시
- Apache 설정: conf.d/subversion.conf에 Location 블록 추가
- 재시작: service httpd restart
- 테스트: 다양한 사용자로 체크아웃 및 커밋 테스트
- 백업: svnadmin dump 정기 수행
간단 복원 예시:
# 기존 저장소 백업
svnadmin dump /data/svn/repo1 > /backups/repo1-YYYYMMDD.dump
# 복원 시
svnadmin create /data/svn/repo1-restored
svnadmin load /data/svn/repo1-restored < /backups/repo1-YYYYMMDD.dump
머릿속 모델(heuristic)
- 중앙형 모델: 모든 변경 기록이 중앙 서버에 저장. 간단한 접근·정책 관리에 유리.
- 권한 흐름: AuthUserFile(인증) -> AuthzSVNAccessFile(인가/경로 권한) -> Apache(DAV 인터페이스)
- 운영 우선순위: 가용성 > 보안 > 편의성. 백업·TLS·로그가 핵심.
간단 용어사전(한 줄)
- SVN: 중앙형 버전 관리 시스템 Subversion
- svnadmin: 저장소를 생성·관리하는 서버 측 유틸리티
- mod_dav_svn: Apache에서 SVN 저장소를 DAV로 노출하는 모듈
- Authz: 권한(authorization) 파일
- htpasswd: Apache 암호 파일 생성/관리 도구
의사결정 흐름(간단한 다이어그램)
flowchart TD
A[새 저장소 필요?] -->|예| B[svnadmin으로 생성]
A -->|아니오| C[기존 저장소 사용]
B --> D[conf 설정'passwd/authz']
D --> E[Apache에 Location 매핑]
E --> F[테스트 및 백업]
F --> G[운영]
요약
이 가이드에서는 CentOS에서 Apache(httpd)와 mod_dav_svn을 사용해 SVN 저장소를 설치하고, 저장소 생성, 사용자 생성(htpasswd), 권한 설정(authz), Apache 설정, 클라이언트 테스트(리눅스와 Windows)를 통해 권한이 의도대로 동작하는지 검증하는 전체 흐름을 다뤘습니다. 운영 시에는 HTTPS 적용, 인증 중앙화, 정기 백업과 로그 감시를 권장합니다.
중요: 실환경에서는 저장소 디렉터리와 인증 파일의 권한을 면밀히 관리하고 TLS를 적용하세요.
추가 자료 및 체크리스트 복사용 템플릿
운영 체크리스트(복사해서 사용):
- 패키지 설치 확인(httpd, subversion, mod_dav_svn)
- /data/svn/
생성 및 소유권 apache:apache 설정 - conf/passwd 및 conf/authz 파일 생성 및 백업
- Apache conf.d/subversion.conf 파일에 Location 등록
- TLS 인증서 설치(권장)
- 방화벽 포트 확인
- 자동 백업 스케줄 구성
- 로그 모니터링 구성
감사합니다. 이 문서를 실환경에 적용할 때는 본인의 배포판 버전과 보안 정책을 꼭 확인하세요.