JPAM とは?  †
- Javaプログラムから Unix アカウントの認証をしたい
- つまり /etc/shadow に書かれているユーザ・パスワードで認証したい
 
- 最近の UNIX のプログラムは PAM で認証する
- rlogin や ssh、ftp は、直接 /etc/shadow を見ているのではなくて PAM の API を使って認証している。PAM が /etc/shadow を読んでいる
- ユーザアカウントの管理を LDAP に変えるときには、PAM の設定だけ変えればよく、アプリケーション側の変更は不要
 
- JPAM は PAM の Java ラッパー
- JPAM も同じように Java から PAM を使って認証する
- PAM の API をたたく部分はネイティブ実装で、JPAMライブラリの中から JNI で呼び出されている
 
- http://jpam.sourceforge.net/index.html
Fedora 13 へのインストール  †
- ダウンロード
$ cd ダウンロード
$ wget http://sourceforge.net/projects/jpam/files/jpam/jpam-1.1/JPam-Linux_i386-1.1.tgz/download
$ tar -xf JPam-Linux_i386-1.1.tgz 
- Javaのありかを見つける
$ ls -la /usr/bin/java
lrwxrwxrwx. 1 root root 22 2010-07-11 14:17 /usr/bin/java -> /etc/alternatives/java
$ ls -la /etc/alternatives/java
lrwxrwxrwx. 1 root root 39 2010-07-11 14:17 /etc/alternatives/java -> /usr/lib/jvm/jre-1.6.0-openjdk/bin/java 
- JPAMのネイティブライブラリのコピー
$ sudo cp JPam-1.1/libjpam.so /usr/lib/jvm/jre-1.6.0-openjdk/lib/i386/client/
$ sudo cp JPam-1.1/libjpam.so /usr/lib/jvm/jre-1.6.0-openjdk/lib/i386/server/ 
- PAMの設定
$ cat /etc/pam.d/net-sf-jpam 
#######################################################################
# Unix PAM Module
# ===============
#
# If using pam_unix you may need to change /etc/shadow to be readable by
# the user executing Jpam.
#######################################################################
auth required /lib/security/pam_unix_auth.so
account required /lib/security/pam_unix_acct.so
password required /lib/security/pam_unix_passwd.so
session required /lib/security/pam_unix_session.so 
JPAM認証プログラム  †
- cf NetBeans Maven2 の コンソールアプリ プロジェクトを作る
- Java
package com.snail.jpamexam;
import net.sf.jpam.Pam;
/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        String user1Name = args[0];
        String user1Credentials = args[1];
        Pam pam = new Pam();
        boolean authenticated
                = pam.authenticateSuccessful(user1Name, user1Credentials);
        System.out.println( user1Name + "/" + user1Credentials + ":" + (authenticated ? "SUCCESS" : "FAIL") );
    }
}
 
- pom.xml(Maven2) 依存ライブラリ全部盛りの jar を作る設定
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.snail</groupId>
    <artifactId>JPamExam</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>JPamExam</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>net.sf.jpam</groupId>
            <artifactId>jpam</artifactId>
            <version>1.1</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <artifactSet>
                                <excludes>
                                    <exclude>junit:junit</exclude>
                                </excludes>
                            </artifactSet>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
 
実行結果  †
[kagyuu@orange ドキュメント]$ java -cp ./JPamExam-1.0-SNAPSHOT.jar com.snail.jpamexam.App kagyuu ************
kagyuu/************:SUCCESS
[kagyuu@orange ドキュメント]$ java -cp ./JPamExam-1.0-SNAPSHOT.jar com.snail.jpamexam.App kagyuu password
kagyuu/password:FAIL
- Viva! OK
- ユーザ権限で実行できるようだ (root権限はいらない)
実運用では  †
- 現在の設定ではパスワード変更なんかもできちゃう
- auth(認証)以外は無効化しておくべきだろう
Java#Others