Sql HANA-激活/停用特定数据库用户的过程

Sql HANA-激活/停用特定数据库用户的过程,sql,hana,hana-sql-script,Sql,Hana,Hana Sql Script,我试图在HANA中开发一个过程,激活和停用一个特殊的数据库用户,并记录这方面的所有内容 我喜欢用户在激活后总是有相同的初始密码,但在登录时被迫更改密码 你知道我该如何实现这一点吗 目前,由于密码策略,我失败了。我不想触碰这个政策,它说最后5个密码是不允许使用的 有没有办法用随机函数给用户五次密码,第六次给默认密码 欢迎提供有关实施、改进和进一步想法的任何反馈 提前感谢。您要求反馈: 围绕可能已设置的安全策略工作 目的不是一个好主意 自己实现日志记录似乎不是一个好主意 任何一个SAP HANA

我试图在HANA中开发一个过程,激活和停用一个特殊的数据库用户,并记录这方面的所有内容

我喜欢用户在激活后总是有相同的初始密码,但在登录时被迫更改密码

你知道我该如何实现这一点吗

目前,由于密码策略,我失败了。我不想触碰这个政策,它说最后5个密码是不允许使用的

有没有办法用随机函数给用户五次密码,第六次给默认密码

欢迎提供有关实施、改进和进一步想法的任何反馈


提前感谢。

您要求反馈:

  • 围绕可能已设置的安全策略工作 目的不是一个好主意

  • 自己实现日志记录似乎不是一个好主意 任何一个SAP HANA将审核作为一项功能提供。而不是 编写日志代码,考虑建立适当的审核策略< /P>
  • 让一个用户拥有与之相同的激活后密码的想法 那么需要改变的是相当不安全的。简直就像 把你房子的钥匙留在门外 进入后交换锁的指令。这不是怎么回事 保安工作

  • ALTER USER

  • 看到您的代码需要一个完整的用户列表,它看起来像一个潜在的使用场景,可能是测试或培训用户。如果是这种情况,建议您根本不要麻烦用户重新激活
    创建永久单一用途账户(如TRAIN01-2020-01。。。 TRAIN01-2020-01)或在出现一组新的 用户应使用这些帐户。这将避免“跳舞”的需要 大约“最后5个密码”策略

  • 请为程序选择名称,以明确代码的作用<代码>“开始”/
    “停止”
    与代码无关

  • 在表中保留停用账户状态的目的是什么?HANA自动跟踪当前状态,包括停用时间戳

  • 在将密码设置为众所周知的密码之前,回到“仅使用5个随机密码”的概念:当以前生成过随机密码时,代码中没有任何内容可以处理这种情况。另外:通常密码策略也会限制每天更改密码的频率-正是为了避免这样的策略


尽管如此,希望这能有所帮助。

我认为,当有人试图重新发明轮子和变通安全策略时,给出任何建议都是不好的,因为其他人将需要支持这个可怕的解决方案

但无论如何,如果最终要设置所需的密码,为什么需要任何随机密码呢?只需循环使用6个预定义密码,然后逐个设置。 对于审核,您可以为该用户创建审核策略,并使用支持的标准工具跟踪更改

编辑: 这是关于“循环6个预定义密码”的代码:

do(在iv_base_pwd nvarchar(20)=>qwe中)
开始
声明lv_pwd_count int;
声明lv_i int:=0;
选择值
进入lv_pwd_计数
来自m_密码_策略
其中property='last_used_passwords';

谢谢你的详细反馈,拉尔斯。我同意你所有的观点,并将改进它们。您是否碰巧知道我如何传递通过其他过程生成的值?我问这个问题是因为我发现了一个密码生成器(),它工作得很好。这不能在其他过程中使用,但您可以轻松地将其转换为函数或提供返回参数。我知道安全违规行为,并且我充分了解HANA方面的安全机制。密码指南说,不仅最后一个密码不能使用,而且最后一个密码也不能使用。无论如何,我将看看如何优化前面的方法。@Toni确实如此。但如果最终使用预定义的pwd,则根本不需要任何随机序列。只需创建一组大小为last_used_passwords+1的密码,并在其上循环以跳过最后N个密码。然后设定一个你想要的。我已经更新了答案。
do( in iv_base_pwd nvarchar(20) => 'qwe')
begin
  declare lv_pwd_count int;
  declare lv_i int := 0;
  
  select value
    into lv_pwd_count
  from m_password_policy
  where property = 'last_used_passwords';
  
  while lv_i <= lv_pwd_count do
    execute immediate 'alter user myuser password ''' || iv_base_pwd || '_' || lv_i | '''';
    lv_i := lv_i + 1;
  end while;

  execute immediate 'alter user myuser password ''' || iv_base_pwd || '''';;
end;