ActiveDirectoryでパスワードを変更できなくて困った

2010.02.27    Windows, セキュリティ, 馬場   タグ: —    baba   

ActiveDirectory環境で、一般ユーザがクライアントPCでパスワードを変更するには、Ctrl+Alt+Deleteを押します。

ここでパスワードの変更を選べばパスワードが変更できるはずですが、

パスワードを変更できませんでした。新しいパスワードとして指定された値は、パスワードの長さ、複雑さ、または履歴に関するドメインの要件を満たしていません。

と言われてしまうことがあります。

この場合は、以下を試してみます。

「Windows2008」などの、複雑さの要件を満たすパスワードを入れてみる

これでOKなら、グループポリシー「パスワードは複雑性の要件を満たす必要がある」が原因です。
嫌なら、これを無効にします。

これでもだめなら、「パスワードの変更禁止期間」が邪魔をしている可能性があります。

デフォルトでは、1週間程度のパスワード変更禁止期間が設定されていて、1日2回変更しようとすると上記のエラーが出るようです。

Default Domain Policyなどで「パスワード変更禁止期間」を0日に設定すれば直りそうです。

どういうわけだか、パスワードのポリシーだけはドメインコントローラーのポリシーが適用されることもあるような、そんな挙動をするので、Default Domain PolicyとDefault Domain Controller Policyの両方で
・パスワード変更禁止期間 → 0日
・パスワードの履歴を保存する → 無効
と設定しておくと良いと思います。

もちろん、ユーザの設定で「ユーザはパスワードを変更できない」にチェックが入っていないか確認し、gpupdate /force を実行するか再起動しておく必要があります。

SET NAMESが危険な理由のおさらい

2010.02.17    PHP, セキュリティ, 馬場   タグ: —    baba   

1年くらい前に社内MLに投げた、「MySQLでSET NAMESを使ってはいけない理由」をコピペしてみます。手抜きです、はい。
赤字は注釈です。


今更ながら、「MySQLで SET NAMES を使ってはいけない」の根拠のお話です。

下記のPHPスクリプトでは、入力値を元にSQL文を生成し、検索クエリを投げています。
※sqltestというDBには、カラムnameを持つuserテーブルが存在します。

GETで渡された値はきちんとmysql_real_escape_stringをかけているので、SQLインジェクションは出来ないように見えます。
しかし、
http://localhost/sqltest/index.php?name=%95%5c’%20OR%201=1%20–%20
にアクセスすると、全部のデータが見えてしまいます。
下にあるPHPスクリプトを、localhost/sqltest/index.php として配置してください。

“SET NAMES SJIS” を実行すると、MySQLのエンコードがShift-JISになりますが、mysql_real_escape_stringはUTF-8のまま動作します。
16進数で 95 5c 27 20 は、
UTF-8: (謎の文字)(バックスラッシュ)(シングルコーテーション)(スペース)
Shift-JIS: (表)(シングルコーテーション)(スペース)
になります。
mysql_real_escape_stringは、バックスラッシュとシングルコーテーションそれぞれをエスケープします。
95 5c 5c 5c 27 20
MySQLは、Shift-JISとして動作するので、 (表)(\)(\)(シングルコーテーション)(スペース) と認識します。
つまり、\が一つ余分に入ることで、入力値のシングルコーテーションがエスケープされなくなります。

マルチバイト非対応のエスケープ関数を使うのと同じ理屈で、SET NAMES は危険です。
基本的に文字コード中に5Cが入るShift-JISが危険ですが、他の文字コードでも似たようなことが起こる可能性があります。
mysql_set_charset(’SJIS’);
なら、mysql_real_escape_stringもShift-JISとして動作するようになるので、安全です。


<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>SQLテストページ</title>
<head>
</head>
<body>

<form action="<?php echo $_SERVER['SCRIPT_NAME'];?>">
	<input type="text" name="name" />
	<input type="submit" value="search" />
</form>

<?php
	//DBに接続
	if (! $db = mysql_connect('localhost', 'sqltest', 'sqltest'))
	{
		echo 'CONNECT ERROR';
		exit;
	}
	mysql_select_db('sqltest', $db);

	mysql_query('SET NAMES SJIS');
//	mysql_set_charset('SJIS');

	//SQLを生成
	$name = mysql_real_escape_string($_REQUEST['name']);
	$sql = "SELECT * FROM user WHERE name='$name'";
	echo $sql . '<br />';

	//実行
	if (! $res = mysql_query($sql))
	{
		echo "QUERY ERROR <br />";
		echo mysql_error();
		exit;
	}

	echo "<pre>";
	while ($row = mysql_fetch_array($res)) {
		print_r($row);
	}
	echo "</pre>";
?>

</body>
</html>

Windowsのアクセス権を初期化

Windowsのフォルダアクセス制限は複雑です。

サーバの共有フォルダにユーザごとのフォルダを作成し、それぞれに排他的なアクセス権を与える、という運用はよくあると思います。
その場合、サーバのHDD交換などの事情で全フォルダを丸ごとコピーする場合などに、サーバ管理者でさえもアクセスできないという問題があります。

Linuxならrootで全部アクセスできるのですが、Windowsでは、Administratorsグループでも、アクセス許可を取得していないとアクセスできません。
アクセス許可を取得するには、所有者の操作が必要ですが、管理者権限で一括でやりたいものです。

このような場合、多少強引ですが、所有者を強引に変更してしまいましょう。
以下、Vista / 7 / Server 2008 / Server 2008 R2 などのOSで、管理者権限でログインしている人が、自マシン内のフォルダの所有権を変更する手順です。

プロパティを開く

プロパティを開く

セキュリティタブの詳細設定を開く

セキュリティタブの詳細設定を開く

所有者の編集

所有者の編集

所有者の編集を開く

所有者の編集を開く

所有者の編集

所有者の編集

新しい所有者を入力

新しい所有者を入力

完了

完了

以上の操作で、アクセス権をリセットに近いことができます。
本当はこんなことやらずに運用をしっかりすれば良いのですが・・・

ノートン先生

家族のPCにNorton Internet Security 2009体験版を入れてみたところ、Shurikenでのメール送受信が出来なくなりました。
POP3S/SMTPSは使えるのですが、POP/SMTPが使えない状態です。インストール直後は平気だったのに、ウィルススキャンをしたらだめになったとか。

110番と25番許可にしたり、ファイアウォールの一番上に全部許可のルール入れたり、アプリケーション制御で信頼するアプリに登録したり、ファイアウォールオフにしたり、ノートン先生丸ごとオフにしたり、色々やっても解決せず、

再起動したら直りました。謎。

やっぱり僕はKasperskyが好きです。高いけど。

COPYRIGHT [C] 2009 BEYOND PERSPECTIVE SOLUTIONS LTD. ALL RIGHTS RESERVED.