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