Subversion, viewvc導入メモ

Linux
この記事は約11分で読めます。
記事内に広告が含まれています。

Amazon Linux2(centos7相当)にsubversion, viewvcを導入してhttpアクセス(apache利用)でLDAP認証を使うようにしたときのメモです。

この令和時代にsubversion・・・?

今更subversionかもしれないですが、利用環境や規模によってはsubversionの良さもあると思ってます。(操作や部分チェックアウトとか簡単だし・・・)

用語説明

◇subversionとは?
集中型のバージョン管理システムです。集中型のため、基本的にサーバと常に通信しないと、各種操作が行えない。歴史的に古いため、ナレッジは豊富。

◇viewvcとは?
ブラウザからリポジトリの内容やログ等を簡単に確認できるためのソフトウエア。

ViewVCの画面。

subversion導入

yumでパッケージをインストールします。

sudo yum update -y
sudo yum install -y httpd subversion mod_dav_svn mod_ldap
補足(パッケージ)

mod_dav_svn = Apache の HTTP サーバを通じて Subversion リポジトリを管理する場合のApache の設定ディレクティブです。mod_ldapを入れないとldap認証が使えません(httpd実行時にUnknown Authn provider: ldapというエラーが発生する)。

続いてsubversion.confを編集します。
sudo vi /etc/httpd/conf.d/subversion.conf

# AD認証が通ったユーザは全員リポジトリアクセスを可能とする。
<Location /repos>
DAV svn
SVNParentPath "/svn/repos"
AuthType basic
AuthName "auth test"
AuthBasicProvider ldap
AuthLDAPURL "ldap://x.x.x.x:3268/dc=aa,dc=bb,dc=jp?sAMAccountName?sub?(objectClass=*)"
AuthLDAPBindDN "abcdef@aa.bb.jp"
AuthLDAPBindPassword "abcdef"
Require valid-user
</Location>
補足(conf)

上記内容の補足です。リポジトリ群「svn/repos配下」を許可し、アクセスする際のURLは「http://サーバIP/repos/リポジトリ名」とします。LDAPのURLやバインド可能なユーザIDやパスワードは適宜変更します。(リポジトリ個別の場合はSVNParentPathではなくSVNPathを使って、Locatoinセクションを複数記載します)

続いてリポジトリを作成し、権限設定やhttpdサービスの再起動や自動起動を有効化します。

cd /svn/repos
sudo svnadmin create sample
sudo chown -R apache:apache /svn/repos
sudo systemctl restart httpd
sudo systemctl enable httpd

動作確認します。

# ここではhome配下のsampleフォルダにチェックアウトしてコミットが出来るかを確認しています。
cd 
svn co http://サーバIP/repos/sample sample
cd sample
mkdir trunk
svn add trunk
svn commit -m "trunk folder commit"

特に難しいところは無いと思います。認証方法は色々なパターンがありますが、ここではLDAP認証が通れば全員許可としました。他パターンについては後述します。

viewvc導入

viewvicの最新版であるver1.2.1を使いたかったため、viewvcに関してはソースコードからインストールします。なお、パッケージからの導入であれば拡張リポジトリを有効後にインストール可能でversionは1.1.xxになります。

# インストール時に対話プロンプトが表示されますがEnterで進めます。
cd
wget https://viewvc.org/downloads/viewvc-1.2.1.tar.gz
tar zxvf viewvc-1.2.1.tar.gz
cd viewvc-1.2.1/
./viewvc-install

続いて、viewvcの設定を変更します。
sudo vi /usr/local/viewvc-1.2.1/viewvc.conf

  • root_parents = /svn/repos: svn
  • 必要に応じてallowed_viewsを有効にしてtar等を追加します。
  • classic画面にしたい場合はtemplate_dir = templates/classicを有効にします。

続いて、viewvcとhttpdを繋げるためのモジュール「mod_wsgi」をインストールします。

yum -y install viewvc-httpd-wsgi

上記に関してAmazon Linux2で拡張リポジトリが有効になっていない場合は「amazon-linux-extras install -y epel」で有効にしておきます(さらに必要に応じて/etc/amazon-linux-extras.confにプロキシ設定)。

続いて、viewvc-wsgi.confを編集します。

# オリジナルを退避して新規で編集します。
mv /etc/httpd/conf.d/viewvc-wsgi.conf /etc/httpd/conf.d/viewvc-wsgi.conf_org
vi /etc/httpd/conf.d/viewvc-wsgi.conf
WSGIScriptAlias /viewvc /usr/local/viewvc-1.2.1/bin/wsgi/viewvc.wsgi
Alias /viewvc-static /root/viewvc-1.2.1/templates/classic/docroot

<Directory /usr/local/viewvc-1.2.1/bin/wsgi>
DAV svn
SVNParentPath "/svn/repos"
AuthType basic
AuthName "auth test"
AuthBasicProvider ldap
AuthLDAPURL "ldap://x.x.x.x:3268/dc=aa,dc=bb,dc=jp?sAMAccountName?sub?(objectClass=*)"
AuthLDAPBindDN "abcdef@aa.bb.jp"
AuthLDAPBindPassword "abcdef"
Require valid-user
</Directory>

なお、上記Directoryセクション内の記載内容はsubversion.confに記載した内容と同じです。URLやアカウント等々は環境に合わせて変更します。

続いてhttpdサービスを再起動します。

sudo systemctl restart httpd

エラーが発生した場合はconf内容に誤りがあるか、必要なモジュールが足りていません。(ここではまると結構時間を使うことがあります・・・)

最後に、動作確認します。
⇒「http://サーバIP/viewvc」でアクセス出来ればOKです。この階層を403にしたい場合はviewvcの設定を変更すればOKです。

苦労した点は最初、mod_pythonをviewvcとhttpdのつなぎ役として利用しようとした点です。ネット上にはmod_pythonに関する情報が多いのですが、httpdの実行時に「Invalid command ‘PythonHandler’ error.」が生じたりと、なかなか組み込めないのです・・・。mod_wsgiの利用が簡単かなと思います。

それでも、mod_pythonをインストールするには、パッケージ導入は難しいので、パス設定または、mod_pythonのソースコードからのインストールを実施すれば出来ます(詳細は割愛)。

subversion.confの色々な設定(ご参考)

/etc/httpd/conf.d/subversion.confに対する認証パターンをいくつか載せておきます。

LDAP認証ユーザ「test1」のみ許可

# LDAP認証ユーザ「test1」のみ許可

<Location /repos>
DAV svn
SVNParentPath "/svn/repos"
AuthType basic
AuthName "auth test"
AuthBasicProvider ldap
AuthLDAPURL "ldap://x.x.x.x:3268/dc=aa,dc=bb,dc=jp?sAMAccountName?sub?(objectClass=*)"
AuthLDAPBindDN "abcdef@aa.bb.jp"
AuthLDAPBindPassword "abcdef"
Require ldap-user test1
</Location>

LDAP認証グループ「g1」のみ許可

# LDAP認証グループ「g1」のみ許可
# グループのCN関係は「dsquery group -name g1」で事前に調べておく。

<Location /repos>
DAV svn
SVNParentPath "/svn/repos"
AuthType basic
AuthName "auth test"
AuthBasicProvider ldap
AuthLDAPURL "ldap://x.x.x.x:3268/dc=aa,dc=bb,dc=jp?sAMAccountName?sub?(objectClass=*)"
AuthLDAPBindDN "abcdef@aa.bb.jp"
AuthLDAPBindPassword "abcdef"
Require ldap-group CN=g1,CN=Users,DC=aa,DC=bb,DC=jp
</Location>

LDAP認証グループ「g1」+ローカル認証ユーザ「test2」のみを許可

# LDAP認証グループ「g1」+ローカル認証ユーザ「test2」のみを許可
# test2ユーザはsudo htpasswd -cb /svn/repos/.htpasswd test2 test2 で事前設定しておく。

<Location /repos>
DAV svn
SVNParentPath "/svn/repos"
AuthType basic
AuthName "auth test"
AuthBasicProvider ldap file
AuthLDAPURL "ldap://x.x.x.x:3268/dc=aa,dc=bb,dc=jp?sAMAccountName?sub?(objectClass=*)"
AuthLDAPBindDN "abcdef@aa.bb.jp"
AuthLDAPBindPassword "abcdef"
Require ldap-group CN=g1,CN=Users,DC=aa,DC=bb,DC=jp
AuthUserFile /svn/repos/.htpasswd
Require user test2
</Location>

LDAP認証グループ「g1」にrepo1、「g2」にrepo2を許可

例えば、

  • /svn/repo1配下の複数リポジトリにグループg1のメンバがアクセス可能
  • /svn/repo2配下の複数リポジトリにグループg2のメンバがアクセス可能
<Location /repo1>
DAV svn
SVNParentPath "/svn/repos1"
AuthType basic
AuthName "auth test"
AuthBasicProvider ldap
AuthLDAPURL "ldap://x.x.x.x:3268/dc=aa,dc=bb,dc=jp?sAMAccountName?sub?(objectClass=*)"
AuthLDAPBindDN "abcdef@aa.bb.jp"
AuthLDAPBindPassword "abcdef"
Require ldap-group CN=g1,CN=Users,DC=aa,DC=bb,DC=jp
</Location>

<Location /repo2>
DAV svn
SVNParentPath "/svn/repos2"
AuthType basic
AuthName "auth test"
AuthBasicProvider ldap
AuthLDAPURL "ldap://x.x.x.x:3268/dc=aa,dc=bb,dc=jp?sAMAccountName?sub?(objectClass=*)"
AuthLDAPBindDN "abcdef@aa.bb.jp"
AuthLDAPBindPassword "abcdef"
Require ldap-group CN=g2,CN=Users,DC=aa,DC=bb,DC=jp
</Location>

なお、LDAPグループにユーザ追加した場合、すぐには認証出来ません。デフォルトでは最大10分かかります。LDAPCacheTTL辺りを設定すれば時間変更できると思います(未確認)。

まとめ

subversion, viewvcの導入メモをご紹介しました。

  • subversion.confを操作することで様々なアクセスケースに対応可能です。
  • viewvcはブラウザでリポジトリ状態が手頃に確認できるため便利です。
    ⇒ こちらも別途アクセス権の設定が可能です。

※個人的にですが本内容によってhttpd(apache)に対する知識向上も出来た気がします。

本記事が誰かのお役に立てば幸いです。

最後までご覧いただき、ありがとうございました。

コメント

Top
タイトルとURLをコピーしました