このブログは、2023 年 5 月 18 日に SAP ジャパン公式ブログに掲載されたものを SAP ジャパン公式ブログ閉鎖に伴い転載したものです。
このブログは、Mark Mumy が執筆したブログ「Copying a Login From One SAP IQ or SAP HDLRE Instance to Another」(2023 年 1 月 20 日)の抄訳です。最新の情報は、SAP Community の最新ブログやマニュアルを参照してください。
長年にわたり、多くのお客様から一つの SAP IQ インスタンスから他の SAP IQ インスタンスへログインをコピーまたは移行する機能をつけてほしいとリクエストがありました。
幸い、同じパスワードを維持したい場合、現在はこれが可能です。
以下で説明するものは、SAP IQとSAP HANA Cloud, data lake リレーショナルエンジン (HDLRE) に同梱されている iqunload ユーティリティーの一部として SAP が使用しているプロセスと同じものです。
ログインとパスワードをコピーするには、SYS.SYSYSER と SYS.SYSUSERPASSWORD の 2 種類のシステムテーブルを使用する必要があります。
これらのテーブルには、(設定されている場合には)システム内の各ユーザーとグループのログインとパスワードが含まれています。
パスワードの抽出プロセスはとても簡単です。
USER_NAME と PASSWORD のカラムが必要なだけです。パスワードは SAP の安全な方法を使用して暗号化されています。
パスワードのリバースエンジニアリングはできません。
しかしながら、CREATE USER と GRANT CONNECT 構文を使用することで、暗号化されたパスワードを渡すことができます。
この方法を使用することで、古いシステムのパスワードで新しいシステムにユーザーを追加することができます。
以下で説明するプロセスは、システムから全ユーザーと null 以外のパスワードを pull します。
ユーザー名または wildcard を指定し、適切な GRANT CONNECT ステートメントを生成することができます。
しかしながら、このプロセスの一部として、暗号化されたパスワードは 16 進数文字列にコンバートする必要があります。
これを行うための hextostr 関数のコードも以下には含めています。
コードは以下のようになります。
drop function if exists dbo.hextostr;
drop procedure if exists dbo.sp_iqreverse_passwd;
create function dbo.hextostr ( bin_expr varbinary(255) )
returns varchar(255)
begin
declare data_len int;
declare i int;
declare newstr varchar(255);
-- for IQ v15
set temporary option ansi_substring='off';
set data_len = datalength( bin_expr );
set newstr = '';
set i = 1;
while i <= data_len loop
set newstr = newstr || '\x' || lower( substring ( inttohex ( substring( bin_expr,i,1) ), 15, 2 ) );
set i = i + 1;
end loop;
return rtrim( newstr );
end;
create procedure dbo.sp_iqreverse_passwd (
in search_name varchar(255) default '%'
)
begin
select 'set temporary option escape_character=''on'';' as 'GRANT STMT'
union all
select 'grant connect to ' + u.user_name +
ifnull(sup.password,';',' identified by encrypted ''' + hextostr( sup.password ) + ''';' )
from sys.sysuser u, sys.sysuserpassword sup
where u.user_id = sup.user_id
and sup.password is not null
and lower(u.user_name) like lower(search_name);
end;
このプロシージャーを実行するには、単純に SAP IQ または SAP HANA Cloud, data lake リレーショナルエンジンにログインし、このプロシージャーを実行するだけです。
grant connect to mark identified by 'password';
call sp_iqreverse_passwd ( 'mark' );
以下のように出力されます。
GRANT STMT
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
set temporary option escape_character='on';
grant connect to mark identified by encrypted '\x01\x2f\x7f\xdf\xf5\x5a\x65\x7d\xa4\xf5\x5f\xf3\x4b\xba\x39\x45\x7f\x9f\x80\xc2\xf5\xa3\x3d\x45\x42\xff\xe8\x0d\xbe\x72\x93\xc5\x60\xda\x97\xe9\x4d';
(2 rows)
このコマンドを同じ SAP IQ インスタンスに対して実行できます。
revoke connect from mark;
set temporary option escape_character='on';
grant connect to mark identified by encrypted '\x01\x2f\x7f\xdf\xf5\x5a\x65\x7d\xa4\xf5\x5f\xf3\x4b\xba\x39\x45\x7f\x9f\x80\xc2\xf5\xa3\x3d\x45\x42\xff\xe8\x0d\xbe\x72\x93\xc5\x60\xda\x97\xe9\x4d';
‘password’ のパスワードを使用して動作するか確認します。
[sap@tmp]$ dbisql -host localhost -port 2638 -nogui -c "uid=mark;pwd=password"
(mark)> select user_name(), db_name()
user_name() db_name()
---------------------
mark iqdemo
(1 rows)
SAP HANA Cloud, data lake リレーショナルエンジンでも同じコードとプロセスを使用することができます。
もちろん、SAP HANA Cloud, data lake リレーショナルエンジンは、クラウドデータベースなため、接続パラメーターは、少し異なります。
もう一つ気をつけなければならない重要な点としては、暗号化されたパスワードを他のユーザーに使うことはできません。
パスワードを作成するために使用されているハッシュアルゴリズムは、ユーザー名に紐づいているからです。
オリジナルのブログはここまでです。