このチュートリアルは、CentOS上にSubversion(SVN)リポジトリをインストール、設定し、Apache(httpd)経由でアクセス制御を行う手順を詳しく説明します。ユーザー管理、権限設定、クライアントでのチェックアウト・コミット検証、運用上の注意点とトラブルシューティング、バックアップやセキュリティ強化の実務的なチェックリストも含みます。
重要: 本手順はCentOS 6 系をベースにしています。CentOSのバージョンやsystemdの有無、SELinuxやファイアウォールの設定によりコマンドやサービス管理方法が変わるため、実運用環境では適宜読み替えてください。
目的と前提
このガイドの目的は次の通りです。
- CentOSにSVNサーバー(Subversion)を構築して、Apache経由でHTTP/HTTPSアクセスを可能にする。
- ユーザー認証(htpasswd)とリポジトリ単位のアクセス制御(authz)で読み取り/書き込み権限を制御する。
- LinuxおよびWindowsクライアントからのチェックアウト、コミット動作を検証する。
定義(1行):Subversion(SVN)は集中型のバージョン管理システムで、リポジトリ単位での履歴管理とアクセス制御が可能です。
システム前提(本チュートリアル時の想定):
- CentOS 6.4(32bit)を使用
- パッケージ管理はyum
- Apache(httpd)、mod_dav_svn、subversionを利用
- リポジトリ格納ディレクトリを /data/svn に作成
重要な関連ポート: HTTP 80、HTTPS 443、svnプロトコル 3690(本手順ではApache経由のHTTP/HTTPSを使用)
目次
- インストールの全体像
- パッケージのインストール例
- リポジトリ作成と所有権設定
- 認証と認可(passwd / authz)の設定
- Apacheの設定(subversion.confの編集)
- クライアントでの動作確認(Linux, Windows)
- セキュリティ強化、バックアップ、運用チェックリスト
- トラブルシューティング、よくある失敗例
- まとめ
インストールの全体像
手順の大まかな流れ:
- 必要パッケージ(httpd, subversion, mod_dav_svn)をインストールする。
- リポジトリ用ディレクトリを作成し、repoを作成する(svnadmin create)。
- Apacheモジュールを読み込み、Locationブロックでリポジトリを公開する。
- htpasswdでユーザーを作成し、authzでアクセス権を細かく設定する。
- Apacheを再起動し、クライアントからチェックアウト・コミットで検証する。
代替: 小規模環境や簡易運用なら独立プロセスのsvnserve(svn://)やSSH経由(svn+ssh://)も選べます。高セキュリティな本番運用ではHTTPS(TLS)を必須にしてください。
1. パッケージのインストール(例)
※ ここで示すコマンド実行例は、元記事の出力を保ちながら日本語で説明しています。
まずインターフェースやIPを確認します(例):
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(Apache)をインストールします。
yum install -y httpd
(インストールログの例は元出力を保持しており省略しています)
次にSubversion本体とApacheモジュールをインストールします。
yum install -y subversion
yum install -y mod_dav_svn
注記: 他のWebサーバ(nginx, lighttpdなど)でもリバースプロキシ等を介して運用は可能ですが、mod_dav_svnはApache専用のモジュールであり、直接の代替にはなりません。
2. リポジトリ作成と基本設定
リポジトリ用ディレクトリを作成します(ここでは /data/svn を使用)。
mkdir -p /data/svn
リポジトリを作成し、Webサーバ(apache)に所有権を与えます。
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はsvnserveデーモンを用いる際の設定ですが、httpd経由でも役に立つ一般的な設定(anon-accessやauth-accessなど)の雛形が含まれます。
例: svnserve.conf の一般設定
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
3. ユーザー管理(htpasswd)とアクセス制御(authz)
Apacheの基本認証用ファイル(htpasswd)を作成してユーザーを登録します。
htpasswd -c /data/svn/repo1/conf/passwd jay
-c はファイル新規作成オプションです。既存ファイルに追加する場合は -c を使わないでください。
追加ユーザー例:
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
アクセス制御(authorization)を行うために authz ファイルを編集します。
vi authz
例:
[repo1:/]
farid = r
fikri = rw
* =
意味:
- farid: 読み取りのみ(r)
- fikri: 読み書き(rw)
- その他または匿名: 権限無し(空)
Authz ファイルはさらに細かくパス単位の制御が可能です(例: [repo1:/trunk/src] user = rw)。
4. Apache(httpd)側の設定
httpd.conf に外部設定の読み込み行があるか確認します。
Include conf.d/*.conf
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
ポイント:
- SVNPath は単一リポジトリ向け。複数リポジトリをまとめて公開する場合は SVNParentPath を使う。
- AuthzSVNAccessFile によってリポジトリ内パスごとのアクセス制御が可能。
- AuthUserFile は htpasswd を指定し、ユーザー認証に使う。
設定変更後にApacheを再起動します。CentOS 6 系では service コマンドを使います。
service httpd restart
再起動ログ例:
[root@SVNSVR641 conf.d]# service httpd restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
5. クライアントでの動作確認(テスト手順)
この章ではLinuxとWindowsクライアントでの基本的な検証手順を示します。
Linuxクライアントからのチェックアウトとコミット確認
クライアントにsubversionが入っていることを確認/インストールします。
yum install -y subversion
作業用ディレクトリを作成してチェックアウトします。
mkdir repo_client
svn co http://192.168.43.101/repo1 repo_client
認証を求められたら、authに登録したユーザー(例: fikri)とパスワードを入力します。パスワードの平文保存に関する注意が表示されることがあります。
チェックアウトが成功したら、ディレクトリを作成してコミットします。
cd repo_client
svn mkdir first_dir
svn commit -m "My first folder"
コミット成功すれば “Committed revision 1.” のような出力が得られます。
Windowsクライアント(TortoiseSVN)での検証
- TortoiseSVNをインストールする。
- 作業用フォルダを作成し、右クリック→SVN CheckoutでURLに http://192.168.43.101/repo1 を入力。
- 認証ダイアログでユーザー名とパスワードを入力。
- checkout後、既にLinuxで作成した first_dir が見えることを確認。
- 読み取り専用ユーザー(例: farid)でログインし、ローカルでファイルを追加してコミットを試みると権限拒否が発生することを確認。
画面例(元画像の説明):
6. 運用上の注意とセキュリティ強化
以下は運用・セキュリティ観点での推奨事項とチェックポイントです。
- HTTPSを必須にする: 認証情報は平文で送信される可能性があるため、TLSを導入しHTTPをリダイレクトしてHTTPSのみ許可する。
- パスワード管理: htpasswdはシンプルだが、LDAPやActive Directory連携を検討すると中央管理が容易になる。
- バックアップ: 定期的に svnadmin dump を使ってリポジトリのダンプを取得し、別ストレージへ保存する。
- フック(hooks): post-commit フックで自動デプロイ、通知、CI連携を行う。
- SELinuxとファイル権限: /data/svn のSELinuxコンテキストを適切に設定し、apacheが読み書きできるようにする。
- ログ監視: Apacheのアクセスログ/エラーログを確認し、異常な試行を検知する。
TLS(HTTPS)設定の手順概要:
- サーバー証明書(自己署名またはCA発行)を用意する。
- ApacheのVirtualHostでポート443を有効化し、SSLEngineをオンにする。
- HTTPからHTTPSへリダイレクトする設定を追加する。
バックアップ(基本):
# 全リポジトリのダンプ例
svnadmin dump /data/svn/repo1 > /backup/repo1-`date +%F`.dump
# 復元
svnadmin load /path/to/newrepo < /backup/repo1-YYYY-MM-DD.dump
※ ダンプ中はリポジトリが読み書き可能だが、運用ポリシーによりメンテナンスウィンドウを設けることを推奨します。
7. フック(hooks)の簡単な例(post-commit)
hooks/post-commit を使ってコミット後にメール通知やCI連携を行えます。実行スクリプトの例(簡易):
#!/bin/bash
REPOS="$1"
REV="$2"
/usr/bin/svnlook changed -r $REV $REPOS | /bin/mail -s "SVN Commit: $REPOS r$REV" [email protected]
スクリプトは実行権限を与えることを忘れないでください。
chmod +x /data/svn/repo1/hooks/post-commit
8. トラブルシューティングとよくある失敗例
問題: クライアントが認証エラーになる
- 確認点: subversionのAuthUserFileが正しく設定されているか。
- htpasswdのファイル形式が正しいか(Apacheのhtpasswd形式)。
- Apacheを再起動したか。
問題: 書き込み(commit)が失敗する(403 Forbidden)
- 確認点: authz の設定で対象ユーザーに適切な権限が与えられているか。
- ファイル所有者/パーミッションが apache によって書き込み可能か。
- SELinuxが原因ならば auditログを確認し、必要に応じてコンテキストを緩和する。
問題: ブラウザでアクセスするとパスが見えない
- SVNPath と Location のパス設定が正しいか。
- Firewallやポート開放がされているか。
デバッグの基本コマンド集:
# Apacheログを追う
tail -f /var/log/httpd/error_log /var/log/httpd/access_log
# SELinuxの拒否ログ確認
ausearch -m AVC,USER_AVC -ts recent
# リポジトリ整合性チェック
svnadmin verify /data/svn/repo1
9. 運用チェックリスト(役割別)
管理者(インフラ):
- ApacheのSSL設定を完了し、証明書の更新スケジュールを管理
- /data/svn の定期バックアップ設定を作成
- SELinux・ファイアウォールルールを検証
リポジトリ管理者(SVN管理):
- authzでパスベースの権限を設計
- ユーザー管理(htpasswdまたは外部認証)を実装
- hooksで必要な通知/自動処理を設定
デベロッパー:
- check out / update / commit の基本操作手順を理解
- SVNの衝突(conflict)解決手順を周知
10. 意思決定フロー(プロトコル選択)
次の簡易フローチャートは、環境に応じた接続方式の選択を助けます(Mermaid形式)。
flowchart TD
A[接続方式を決める] --> B{ローカルLANかインターネットか}
B --> |ローカルLAN| C[svn:// 'svnserve' を検討]
B --> |インターネット| D[HTTPS を強く推奨]
C --> E{認証を外部に任せるか}
E --> |はい| F[SSH経由'svn+ssh'やLDAP連携]
E --> |いいえ| G[svnserve の認証設定]
D --> H[Apache + mod_dav_svn を選択しTLSを有効に]
11. 小さな設計ヒューリスティクス(Mental models)
- 集中型(SVN)は「真ん中に単一の真実(リポジトリ)」を置く設計。小〜中規模のチームや、バイナリファイルを多く扱うプロジェクトに向く。
- Github/Gitのような分散型との違いを明確にして運用ポリシーを決める(ブランチ戦略、CI連携、バックアップ頻度)。
- 権限は最小権限の原則(Least Privilege)で設計する。
12. 受け入れテスト(簡易)
- 管理者は以下を確認する:
- ApacheがHTTPSでリッスンしている(ポート443)
- authzで指定した読み書き権限が期待通りに動作する
- デベロッパーは以下を確認する:
- checkout -> add -> commit が権限に応じて成功/失敗する
- 別ユーザーでの表示権限を確認
13. まとめ
- CentOSにおけるSVNサーバー構築は、httpd + mod_dav_svn + subversion の組み合わせで比較的シンプルに実現できる。
- ユーザー管理(htpasswd)とauthzによるパスベースの権限制御が重要。
- 本番運用ではTLS(HTTPS)、バックアップ、ログ監視、SELinux/ファイアウォールの設定を忘れないこと。
重要: このガイドはCentOS 6 系を前提にした手順を含みます。他バージョンやディストリビューションではsystemd の使用、パッケージ名やサービス制御コマンドが変わります。移行や本番導入時は各環境に合わせて検証してください。
要点まとめ
- SVNは集中型のバージョン管理で、Apache連携によりHTTP/HTTPSでのアクセスが可能。
- ユーザー認証はhtpasswd、アクセス制御はauthzで細かく設定できる。
- 運用ではTLS、バックアップ、ログ監視が不可欠。
参考: 主要コマンドのクイックチートシート(抜粋)
# リポジトリ作成
svnadmin create /data/svn/repo1
# htpasswd ユーザー追加
htpasswd -c /data/svn/repo1/conf/passwd alice
# authz 例
vi /data/svn/repo1/conf/authz
# Apache再起動(CentOS6)
service httpd restart
# リポジトリダンプ(バックアップ)
svnadmin dump /data/svn/repo1 > /backup/repo1-YYYY-MM-DD.dump
# リポジトリ検証
svnadmin verify /data/svn/repo1
発展ノート: LDAP/AD連携、リバースプロキシ構成、CI/CD統合(フック活用)などは運用要件に応じて導入検討してください。