- PR -

OSのログインとWEBアプリケーションへのログインのシングルサインオンによる管理

1
投稿者投稿内容
ぬべたそ
ベテラン
会議室デビュー日: 2003/12/18
投稿数: 72
投稿日時: 2005-08-26 18:05
いつも参考にさせて頂いています。

今回、お客さんからの要件で次のようなシステムを考えています。

Windowsのログイン画面でログインした情報を使って、開発するWEBアプリケーションにログインする。

1.Windowsのログイン画面でユーザID・パスワードを入力し、PCを起動する。
2.ブラウザを起動して、業務WEBアプリケーションに接続する。
3.この際、ログインフォーム等を表示せず、Windowsのログイン画面で入力したことで、この機能に代える。

今まで、WEBアプリケーション同士でのシングルサイオンを行ったことはあるのですが、今回のように、OSとWEBアプリケーションというのは初めてで、全くイメージ、キーワードが思いつきません。

どのような技術、ミドルウェア等を組み合わせれば実現できるのでしょうか?

環境は
クライアント:window xp pro
サーバ:windows 2003 server standard
アプリケーションサーバ:WebSphere v6.0
の予定です。

ご教授、よろしくお願い致します。
hakone
会議室デビュー日: 2005/08/24
投稿数: 2
投稿日時: 2005-08-28 10:01
こんにちは。

私も詳しくないのですが、GINA(DLL)を独自のものに置き換えると
独自のログオン画面が作れるらしいですよ。
独自のログオン画面でなら、ID,PASSも取得できると思います。
加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2005-09-01 22:31
Windowsログオンの状態から、Webアプリケーションへのログオンを
行う方法

手順を二つに分ける
(1)ブラウザからローカルマシン情報へのアクセス方法を確保する。
(2)ローカルマシン情報をどこからどこまで取るかを規定する

(1)に関しては、
applet or ActiveXでクライアントマシンへのアクセス方法を確保する。
結局はコード署名をすることになる。
コード署名によりそのクライアント(ブラウザ)で実行する処理自体を保証する。

(2)ローカルマシン情報は、基本的にはユーザ名になる。(の?要件を知らないけど)
パスワードは「処理」つまり「アルゴリズム」になる(ユーザ名のみの場合)
もちろんばれるけど、それはコード署名により処理が正しく行われることは保証する。

ユーザ名の取り方は大まかに3つ。
・レジストリ読む
->セキュリティ的に弱い。簡単に記述を変えられるから。技術的に簡単。
・起動しているプロセスから読む
->セキュリティ的に一番強固(にできるかも)。技術的にむずかしい。
・ネットワーク的なサーバ(Windowsでは「ワークステーション」)から読む
->セキュリティ的につおい(レジストリよりは)。技術的に簡単。でもサポート範囲が狭い。

・起動しているプロセスから読むのは、プロセス(というかプログラムを固定)するか、
あるいは今起動しているプログラムからかで少し違うが、要は以下の
init_user_info()のような方法でユーザ名を読み取る。個々の関数はMSDN参照。
iexplorer.exeプロセスを探してもよい。
起動したプロセス中でCryptoAPIのデフォルトで使用する鍵コンテナを仕込んでおいて
デフォルト鍵コンテナはそのユーザしかアクセスできないから
その鍵で暗号化or署名できたらログインできたことにする。という技もある。
意外と難しいけど。

ネットワーク読み、は
NetWkstaUserGetInfo ()を使う。MSDN参照(英語かな?)
この関数はローカルマシン上のユーザを読む関数である。
ただし、これをDCとかAD上でどうなるかが不安(とゆうより読めないであろう)

ということで要件によっていろいろ使い分けることになる。

#include <windows.h>

#define PASSWD_FIELD_SIZE 256

static char the_passwd_name[PASSWD_FIELD_SIZE];
static char the_passwd_passwd[PASSWD_FIELD_SIZE];

void
init_user_info ();

int main(int argc, char* argv[])
{

init_user_info ();

return 0;
}

void
init_user_info ()
{
/* Find the user's real name by opening the process token and
looking up the name associated with the user-sid in that token.

Use the relative portion of the identifier authority value from
the user-sid as the user id value (same for group id using the
primary group sid from the process token). */
char user_sid[256], name[256], domain[256];
DWORD length = sizeof (name), dlength = sizeof (domain), trash;
HANDLE token = NULL;
SID_NAME_USE user_type;

if (OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &token)
&& GetTokenInformation (token, TokenUser,
(PVOID) user_sid, sizeof (user_sid), &trash)
&& LookupAccountSid (NULL, *((PSID *) user_sid), name, &length,
domain, &dlength, &user_type))
{
strcpy (the_passwd_name, name);
/* Determine a reasonable uid value. */
}
else
if (GetUserName (name, &length))
{
strcpy (the_passwd_name, name);
}

if (token)
CloseHandle (token);

printf("user name %s\\n",name);
}
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-09-02 09:38
おはようございます。
この分野は専門ではないのですが、興味があったため。

InternetExplorerでは、セキュリティ設定によっては、OSの認証情報を使ってWebの認証を行うようですが、これを活用できないでしょうか?
Basic認証ではアレですが、統合Windows認証というのもあるようですし。

以上、ご参考まで。
ぬべたそ
ベテラン
会議室デビュー日: 2003/12/18
投稿数: 72
投稿日時: 2005-09-05 11:37
hakoneさん、加納正和、angelさん、ご返信ありがとうございます。

お客さんからもう少し聞き出してみました。
Windowsログイン時にActive Directoryで認証されたユーザIDを、WEBアプリケーションのユーザIDとして使いたいということみたいです。

>hakoneさん、加納正和さん
windowsプログラミングに関して疎いため、頂いた情報を社内で相談する等して、考察致します。具体的なサンプルコードまで示して頂き、ありがとうございます。

>angelさん
統合Windows認証はIISでのみ動作するようですが、WebSphereでも可能でしょうか?
OSの認証情報をWEBの認証にも使う方法は、それらしき物をWebLogicの技術情報で発見しました。
http://edocs.beasys.co.jp/e-docs/wls/docs81/secmanage/sso.html
WebSphereでも実現できるか調べてみます。

IEを起動する時点で、自作のアプリケーションを先に起動し、OS(Active Directory?)からユーザIDを取得した後、ユーザIDをセッションに格納するなどして、IEを起動し、WEBアプリケーションにアクセスしようと考えています。

まだまだ分からないことだらけで、投稿内容もおかしいところばかりかもしれません。
引き続き情報をよろしくお願い致します。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-09-05 17:55
こんにちは。
引用:
>angelさん
統合Windows認証はIISでのみ動作するようですが、WebSphereでも可能でしょうか?


正直、WebSphere での認証については分かりません。
フロントを IIS で受け持って、プラグインを通じて IIS・WebSphere間で連携するという形態を想像していました。
# UNIX系であれば、Apache + mod_auth_kerb でしょうか…。

認証に関しては、全URLで認証をかけても良いのでしょうが、
 ・ログイン画面のみを認証対象にする。
 ・ログイン画面でセッションIDを発行する。
 ・ログイン処理において、認証情報とセッション情報の紐付けを行う。
 ・以降の画面では認証情報ではなくセッションIDで管理する。
のような手もありか、と想像していました。
※ログイン画面というより、自動ログインなので Welcome画面??

全く裏を取っていない、アイデアレベルの話ですのでご注意を。

[ メッセージ編集済み 編集者: angel 編集日時 2005-09-05 17:56 ]
加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2005-09-05 23:51
加納正和、です。

引用:

IEを起動する時点で、自作のアプリケーションを先に起動し、OS(Active Directory?)からユーザIDを取得した後、ユーザIDをセッションに格納するなどして、IEを起動し、WEBアプリケーションにアクセスしようと考えています。



も、もしかして、、、

# getuser iexploler.exe "http://example.com&user=%username%"

ですか。。。getuserプログラム内でユーザ名取り出して、クッキーか、
あるいはパラメータとして送るという。。。

どのみちクッキーにつけるにせよ、パラメータにするにせよ、その文字列自身
の信用はどこから担保するのでしょう?

例えば上記の%username%が"kanoh"だったとして"kanoh"という文字列を
信用できる。。。わけないよなぁ、とか思い。

kerberos認証は共通鍵ベースなのでクライアントと認証サーバで同じ
パスワードを知る必要があります(kerberosのいいところはクライアント
認証サーバ間のみであって他のアプリケーションサーバとはパスワードは
共有しないところ)

この用件だと微妙な気がする。この意味の「クライアント」って「IE」
だし。あと、あらかじめ認証サーバにADにいれたユーザID
のパスワードを「認証サーバ」に入れられるのか?

「IE」は、、まぁ無理だな。断言はしないけど。

ADって認証サーバぢゃんって?
。。。んーそうなんだけど。。。。ADはkerborosプロトコルなだけだからなぁ。

意外に(?)相互運用性があるんだけど、落とし穴が多い。DES 40bitだけとか。
しかも落とし穴にはめられるようにWebページに「ちりばめて」書いてあるところが
なかなか。きっと苦労したのだろう。

単なる要求のひとつだろうから、あまり工数をかけたくないのだろうと想像するけど
80/20の法則で20%なのが、これら見かけ上だけ簡単、でも仕掛け困難なセキュリティ。

でも最近それら実装しないと顧客から怒られるところがにんともかんとも。。。
昔は「後で」って言えたんだけどねぃ(で、ばっくれる)

いまはそれぐらい「つけます」って言わないとお仕事取れないようだし。
ぬべたそ
ベテラン
会議室デビュー日: 2003/12/18
投稿数: 72
投稿日時: 2005-09-06 08:11
angelさん、加納正和さん、ご返信ありがとうございます。

>angelさん
IISとWebSphereを連携するという方法は考えていませんでした。
WebSphereに付属のWEBサーバを使おうと考えていましたので。
IISとの組合せを調べてみます。

>加納正和さん
URLパラメータとしてユーザIDを受け渡す方法は確かにセキュリティ面が気になりました。
手でURL+パラメータを直打ちすれば、他のIDになりすますことができますから。

ユーザIDの取得はWSHを使えば簡単に出来そうですが、後はお客さんの要求次第だと考えています。
イントラネットの業務系アプリケーションなので、「なりすまし」は対応しなくて良い、等と話しが落ち着けば楽なのですが。
実は他社が開発した業務系アプリケーションが既に使われていて、それに合せて欲しいということらしいので、そちらの分析から入った方が良いのだと思います。

アドバイスありがとうございます。
要件を詰めたらまた書込みたいと思います。

気付いたことなど有りましたら、ご意見をお願い致します。



[ メッセージ編集済み 編集者: ぬべたそ 編集日時 2005-09-06 08:18 ]
1

スキルアップ/キャリアアップ(JOB@IT)