パスワードは、データベースのセキュリティ・システムの重要な部分です。安全のために、パスワードは容易に推測できないものにし、ハード・ドライブやその他のロケーションから簡単にアクセスできないようにしてください。SQL Anywhere のパスワードでは、常に大文字と小文字が区別されます。パスワード認証に使用する関数を verify_password_function オプションで指定できます。verify_password_function オプション [データベース]を参照してください。
ログイン・ポリシーを使用して、ユーザ・パスワードの変更頻度の設定や、アカウントがロックされるまでに実行可能なログイン試行回数の指定を行います。ログイン・ポリシーの管理の概要またはCREATE LOGIN POLICY 文を参照してください。
新しく作成されるデータベースのデフォルトのユーザ ID とパスワードは、DBA と sql です。このパスワードを変更してから、データベースを展開してください。
デフォルトでは、パスワードは任意の長さで指定できます。セキュリティを強化するために、新しいパスワードに必要な最小長を課し、推測されやすい短いパスワードの指定を防止することができます。これを実行するには、min_password_length データベース・オプションを 0 より大きな値に設定します。次の文は、パスワードが最低でも 8 バイトの長さになるようにします。
SET OPTION PUBLIC.min_password_length = 8; |
min_password_length オプション [データベース]を参照してください。
デフォルトでは、データベース・パスワードに有効期限はありません。ログイン・ポリシーを使用して、パスワードの有効期限を導入できます。ログイン・ポリシーの管理の概要を参照してください。
パスワードはデータベースへのアクセスのキーとなります。そのため、セキュリティを考慮した環境では、権限のないユーザが簡単にパスワードを使用できないようにすることが重要です。
ODBC データ・ソースを作成するとき、または Sybase Central 接続プロファイルを作成するときに、オプションでパスワードを含めることができます。権限のないユーザによって参照されないようにするため、パスワードは含めないようにしてください。
ODBC データ・ソースの作成を参照してください。
設定ファイルを作成するとき、パスワード情報をオプションとして組み込むことができます。パスワードを保護するために、ファイル難読化ユーティリティ (dbfhide) を使用し、単純暗号化で設定ファイルの内容を隠すことを検討してください。ファイル難読化ユーティリティ (dbfhide)を参照してください。
verify_password_function オプションを使用して、パスワード規則を実装する関数を指定できます。verify_password_function オプション [データベース]を参照してください。
次の例では、テーブルと関数を 1 つずつ定義し、いくつかのログイン・ポリシー・オプションを設定しています。これらは共に、パスワードに特定の種類の文字が含まれることを要求し、パスワードの再利用を禁止して、パスワード有効期限を適用するなど、詳細なパスワード規則を実装します。ユーザ ID が作成されるか、パスワードが変更されると、データベース・サーバによって verify_password_function オプションを使用して関数が呼び出されます。アプリケーションは、post_login_procedure オプションで指定されたプロシージャを呼び出して、パスワードが期限切れになる前にパスワードの変更が必要であることを通知できます。
このサンプル・コードは、samples-dir\SQLAnywhere\SQL\verify_password.sql にもあります。samples-dir の詳細については、サンプル・ディレクトリを参照してください。
-- This example defines a function that implements advanced password rules -- including requiring certain types of characters in the password and -- disallowing password reuse. The f_verify_pwd function is called by the -- server using the verify_password_function option when a user ID is -- created or a password is changed. -- -- The "root" login profile is configured to expire passwords every 180 days -- and lock non-DBA accounts after 5 consecutive failed login attempts. -- -- The application may call the procedure specified by the -- post_login_procedure option to report that the password should be changed -- before it expires. -- only DBA should have permissions on this table CREATE TABLE DBA.t_pwd_history( pk INT DEFAULT AUTOINCREMENT PRIMARY KEY, user_name CHAR(128), -- the user whose password is set pwd_hash CHAR(32) ); -- hash of password value to detect -- duplicate passwords -- called whenever a non-NULL password is set -- to verify the password conforms to password rules CREATE FUNCTION DBA.f_verify_pwd( uid VARCHAR(128), new_pwd VARCHAR(255) ) RETURNS VARCHAR(255) BEGIN -- a table with one row per character in new_pwd DECLARE local temporary table pwd_chars( pos INT PRIMARY KEY, -- index of c in new_pwd c CHAR( 1 CHAR ) ); -- character -- new_pwd with non-alpha characters removed DECLARE pwd_alpha_only CHAR(255); DECLARE num_lower_chars INT; -- enforce minimum length (can also be done with -- min_password_length option) IF length( new_pwd ) < 6 THEN RETURN 'password must be at least 6 characters long'; END IF; -- break new_pwd into one row per character INSERT INTO pwd_chars SELECT row_num, substr( new_pwd, row_num, 1 ) FROM dbo.RowGenerator WHERE row_num <= length( new_pwd ); -- copy of new_pwd containing alpha-only characters SELECT list( c, '' ORDER BY pos ) INTO pwd_alpha_only FROM pwd_chars WHERE c BETWEEN 'a' AND 'z' OR c BETWEEN 'A' AND 'Z'; -- number of lower case characters IN new_pwd SELECT count(*) INTO num_lower_chars FROM pwd_chars WHERE CAST( c AS BINARY ) BETWEEN 'a' AND 'z'; -- enforce rules based on characters contained in new_pwd IF ( SELECT count(*) FROM pwd_chars WHERE c BETWEEN '0' AND '9' ) < 1 THEN RETURN 'password must contain at least one numeric digit'; ELSEIF length( pwd_alpha_only ) < 2 THEN RETURN 'password must contain at least two letters'; ELSEIF num_lower_chars = 0 OR length( pwd_alpha_only ) - num_lower_chars = 0 THEN RETURN 'password must contain both upper- and lowercase characters'; END IF; -- not the same as any user name -- (this could be modified to check against a disallowed words table) IF EXISTS( SELECT * FROM SYS.SYSUSER WHERE lower( user_name ) IN ( lower( pwd_alpha_only ), lower( new_pwd ) ) ) THEN RETURN 'password or only alphabetic characters in password ' || 'must not match any user name'; END IF; -- not the same as any previous password for this user IF EXISTS( SELECT * FROM t_pwd_history WHERE user_name = uid AND pwd_hash = hash( uid || new_pwd, 'md5' ) ) THEN RETURN 'previous passwords cannot be reused'; END IF; -- save the new password INSERT INTO t_pwd_history( user_name, pwd_hash ) VALUES( uid, hash( uid || new_pwd, 'md5' ) ); RETURN( NULL ); END; ALTER FUNCTION DBA.f_verify_pwd SET HIDDEN; GRANT EXECUTE ON DBA.f_verify_pwd TO PUBLIC; SET OPTION PUBLIC.verify_password_function = 'DBA.f_verify_pwd'; -- All passwords expire in 180 days. Expired passwords can be changed -- by the user using the NewPassword connection parameter. ALTER LOGIN POLICY root password_life_time = 180; -- If an application calls the procedure specified by the -- post_login_procedure option, then the procedure can be used to warn -- the user that their password is about to expire. In particular, -- Interactive SQL and Sybase Central call the -- post_login_procedure system procedure. ALTER LOGIN POLICY root password_grace_time = 30; -- Five consecutive failed login attempts will result in a non-DBA -- user ID being locked. ALTER LOGIN POLICY root max_failed_login_attempts = 5; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |