Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - データベース管理 » セキュリティ » 安全なデータの管理 » データベース・アクセスの制御

 

パスワードのセキュリティの強化

パスワードは、データベースのセキュリティ・システムの重要な部分です。安全のために、パスワードは容易に推測できないものにし、ハード・ドライブやその他のロケーションから簡単にアクセスできないようにしてください。SQL Anywhere のパスワードでは、常に大文字と小文字が区別されます。パスワード認証に使用する関数を verify_password_function オプションで指定できます。verify_password_function オプション [データベース]を参照してください。

ログイン・ポリシーの実装

ログイン・ポリシーを使用して、ユーザ・パスワードの変更頻度の設定や、アカウントがロックされるまでに実行可能なログイン試行回数の指定を行います。ログイン・ポリシーの管理の概要またはCREATE LOGIN POLICY 文を参照してください。

デフォルトのユーザ ID とパスワードの変更

新しく作成されるデータベースのデフォルトのユーザ ID とパスワードは、DBAsql です。このパスワードを変更してから、データベースを展開してください。

最小長のパスワードの実装

デフォルトでは、パスワードは任意の長さで指定できます。セキュリティを強化するために、新しいパスワードに必要な最小長を課し、推測されやすい短いパスワードの指定を防止することができます。これを実行するには、min_password_length データベース・オプションを 0 より大きな値に設定します。次の文は、パスワードが最低でも 8 バイトの長さになるようにします。

SET OPTION PUBLIC.min_password_length = 8;

min_password_length オプション [データベース]を参照してください。

パスワード有効期限の導入

デフォルトでは、データベース・パスワードに有効期限はありません。ログイン・ポリシーを使用して、パスワードの有効期限を導入できます。ログイン・ポリシーの管理の概要を参照してください。

ODBC データ・ソースにパスワードを含めない

パスワードはデータベースへのアクセスのキーとなります。そのため、セキュリティを考慮した環境では、権限のないユーザが簡単にパスワードを使用できないようにすることが重要です。

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;