・ Web系SE募集 (技術開発部開発系エンジニア・Java/Tomcat 420万円~750万円)
   ・ 社内SE募集 (業務系システムの開発・社内イントラ)

2009年3月アーカイブ

Redmineのユーザー == SVNのユーザーとする.
SVNの認証をRedmineのDBを見る様にする。
 
考え方:
ApacheのBasci認証では、たいていの場合、htpasswd コマンドで認証用のユーザー/PASSを生成し、AuthUserFileでそのファイルを見るようにしますが、
ApacheのBasci認証で、RedmineのDBの usersテーブルをみに行くようにします。
その時、RedmineのDBの usersテーブルとApacheのBasci認証で使われる(htpasswd -s で生成される)パスワードのフォーマットが一致していなければなりませんが、
残念ながら異なります。
RedmineのDBの usersテーブルのパスワードのフォーマットは、SHA-1ダイジェストを16進形式で保存されています。
一方、htpasswd -s で生成されるApacheのBasci認証 パスワードは、SHA-1ダイジェストを Base64 です。
SVNで認証の際に、RedmineのDBを見に行って、SHA-1ダイジェストの16進形式をBase64に変換すればいいわけです。
ApacheのBasci認証 htpasswd -s と同じフォーマット にしてやるのです。
 

htpasswd で生成可能なフォーマットは
http://httpd.apache.org/docs/trunk/ja/programs/htpasswd.html
を参照

 

前提:
  • 当然ですが、SVN の URLが http~を使う
  • SVNの認証は、Apache Basic認証を使う
  • Redmine の DBは、MySQL
  • mysql  Ver  5.1.31
 
実現方法:
Apache にDB認証させる為に、-enable-authn-dbd オプション付で configure します。
MySQLには16進とBase64を変換する関数はありませんので、UDFで対応します。
そのためMySQLのインストールオプションに、--with-mysqld-ldflags=-rdynamic を付けて configure します。
 
 
 

 
Apache インストール
 
./configure \
--prefix=/usr/local/apache2.2\
--enable-so --enable-proxy \
--enable-rewriter \
--enable-deflate \
--enable-ssl  \
--enable-dav \
--enable-authn-dbd
 
 
 
 
MySQLインストール
 
./configure \
--prefix=/usr/local/mysql \
--enable-assembler \
--enable-local-infile \
--without-readline \
--with-client-ldflags=-all-static \
--with-mysqld-ldflags=-all-static \
--with-innodb \
--with-federated-storage-engine \
--with-archive-storage-engine \
--with-csv-storage-engine \
--with-blackhole-storage-engine \
--with-fast-mutexes \
--with-example-storage-engine \
--with-mysqld-ldflags=-rdynamic 

 
$ make && force=--force  make test-ns && make test-pr
 
 
c で 16進とBase64変換 が書ければベストですが、ここは得意のPerlでやってしまいます。
次のURLを参考に、MySQLから perl スクリプトを実行出来る様にします。
※ c で 16進とBase64変換するコードだれか下さい。
 
作成した、UDFのファイル名は、udf_perl.so です。
 
作成した URF udf_perl.so を/usr/local/mysql/lib/mysql/plugin/ に置く。

変換するスクリプト
$ cat mysql_udf/sha1_hex2base64.pluse MIME::Base64;sub pfunc{    my $pass = shift;    $pass =~ s/\s+$//;    $pass = encode_base64(pack("H*",$pass));    chomp  $pass;    return '{SHA}'.$pass;} 

変換するスクリプトは適当な場所に置く(上記の参考URLのCのソースも参照)
 
mysql> CREATE FUNCTION udf_perl RETURNS STRING SONAME 'udf_perl.so';
※レプリケーションしてる場合は、レプリケーション先にもこのSQLが流れるので注意!
 
上手くいけば、次のSQLで 「{SHA}~」と結果を取得できます。
mysql> select udf_perl('sha1_hex2base64.pl',hashed_password) from users ;                    
 
そして、ApacheのConfファイルを設定します。
 $ cat mysql_udf/httpd-svn.conf<VirtualHost *:443>    ServerName svn.host:443    DocumentRoot /home/httpd/vhost/svn/public    ErrorLog     "|/usr/local/apache2.2/bin/rotatelogs /home/httpd/vhost/svn/logs/ssl_error_log.%Y%m%d 86400"    TransferLog  "|/usr/local/apache2.2/bin/rotatelogs /home/httpd/vhost/svn/logs/ssl_access_log.%Y%m%d 86400"    CustomLog    "|/usr/local/apache2.2/bin/rotatelogs /home/httpd/vhost/svn/logs/ssl_request_log.%Y%m%d 86400" "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"    SSLEngine on    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL    SSLCertificateFile    "/usr/local/apache2.2/conf/extra/vhost/ssl_svn_dav.crt"    SSLCertificateKeyFile "/usr/local/apache2.2/conf/extra/vhost/ssl_svn_dav.key"    <Directory /home/httpd/vhost/svn/public>      Order allow,deny      Allow from all    </Directory>      Driver mysql
     Params "dbname=redmine user=redmineadmin"
     Min  1
     Keep 2
     Max  10
     Exptime 60
    <Location /repos>      Order Allow,Deny      Allow from all      Dav On      DAV             svn      SVNParentPath   /home/svn/repository      AuthzSVNAccessFile /home/svn/access/svnauth-file      AuthType        Basic     AuthName        "Subversion repository"      AuthBasicProvider dbd      Require valid-user      AuthDBDUserPWQuery "select udf_perl('sha1_hex2base64.pl',hashed_password) from users where login = %s"    </Location></VirtualHost>


 
 
 
以上、これでSVNとRedmineのユーザーが同期され,RedmineのユーザーIDとパスワードでSVNにアクセスできる。

 

 

このアーカイブについて

このページには、2009年3月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2009年2月です。

次のアーカイブは2009年5月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。