This is an automated email from the ASF dual-hosted git repository.
luozenglin pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push:
new 1d136d99cc9 [Enhance](fe) Support setting initial root password when
FE firstly launch (#27438) (#27603)
1d136d99cc9 is described below
commit 1d136d99cc9ca4ef4e593b7096448faa4bbdb88f
Author: DuRipeng <[email protected]>
AuthorDate: Tue Nov 28 10:33:15 2023 +0800
[Enhance](fe) Support setting initial root password when FE firstly launch
(#27438) (#27603)
---
docs/en/docs/admin-manual/config/fe-config.md | 12 +++++++++++
docs/zh-CN/docs/admin-manual/config/fe-config.md | 12 +++++++++++
.../main/java/org/apache/doris/common/Config.java | 12 +++++++++++
.../main/java/org/apache/doris/catalog/Env.java | 2 ++
.../org/apache/doris/mysql/privilege/Auth.java | 25 ++++++++++++++++++++++
.../org/apache/doris/mysql/privilege/AuthTest.java | 18 ++++++++++++++++
6 files changed, 81 insertions(+)
diff --git a/docs/en/docs/admin-manual/config/fe-config.md
b/docs/en/docs/admin-manual/config/fe-config.md
index 56f77d3f774..a34e3a56a62 100644
--- a/docs/en/docs/admin-manual/config/fe-config.md
+++ b/docs/en/docs/admin-manual/config/fe-config.md
@@ -376,6 +376,18 @@ Is it a configuration item unique to the Master FE node:
true
Whether to enable the multi-tags function of a single BE
+#### `initial_root_password`
+
+Set root user initial 2-staged SHA-1 encrypted password, default as '', means
no root password. Subsequent `set password` operations for root user will
overwrite the initial root password.
+
+Example: If you want to configure a plaintext password `root@123`. You can
execute Doris SQL `select password('root@123')` to generate encrypted password
`*A00C34073A26B40AB4307650BFB9309D6BFA6999`.
+
+Default: empty string
+
+Is it possible to dynamically configure: false
+
+Is it a configuration item unique to the Master FE node: true
+
### Service
#### `query_port`
diff --git a/docs/zh-CN/docs/admin-manual/config/fe-config.md
b/docs/zh-CN/docs/admin-manual/config/fe-config.md
index cee124b9980..f1ebb92935d 100644
--- a/docs/zh-CN/docs/admin-manual/config/fe-config.md
+++ b/docs/zh-CN/docs/admin-manual/config/fe-config.md
@@ -376,6 +376,18 @@ heartbeat_mgr 中处理心跳事件的线程数。
是否开启单BE的多标签功能
+#### `initial_root_password`
+
+设置 root 用户初始化2阶段 SHA-1 加密密码,默认为'',即不设置 root 密码。后续 root 用户的 `set password` 操作会将
root 初始化密码覆盖。
+
+示例:如要配置密码的明文是 `root@123`,可在Doris执行SQL `select password('root@123')` 获取加密密码
`*A00C34073A26B40AB4307650BFB9309D6BFA6999`。
+
+默认值:空字符串
+
+是否可以动态配置:false
+
+是否为 Master FE 节点独有的配置项:true
+
### 服务
#### `query_port`
diff --git a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java
b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java
index 6b5626fedba..92fa8130757 100644
--- a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java
+++ b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java
@@ -2210,6 +2210,18 @@ public class Config extends ConfigBase {
@ConfField(mutable = true, masterOnly = true)
public static int publish_topic_info_interval_ms = 30000; // 30s
+ @ConfField(masterOnly = true, description = {
+ "设置 root 用户初始化2阶段 SHA-1 加密密码,默认为'',即不设置 root 密码。"
+ + "后续 root 用户的 `set password` 操作会将 root 初始化密码覆盖。"
+ + "示例:如要配置密码的明文是 `root@123`,可在Doris执行SQL `select
password('root@123')` "
+ + "获取加密密码 `*A00C34073A26B40AB4307650BFB9309D6BFA6999`",
+ "Set root user initial 2-staged SHA-1 encrypted password, default as
'', means no root password. "
+ + "Subsequent `set password` operations for root user will
overwrite the initial root password. "
+ + "Example: If you want to configure a plaintext password
`root@123`."
+ + "You can execute Doris SQL `select password('root@123')` to
generate encrypted "
+ + "password `*A00C34073A26B40AB4307650BFB9309D6BFA6999`"})
+ public static String initial_root_password = "";
+
@ConfField(description = {
"限制fe节点thrift server可以接收的最大包大小,默认20M,设置为-1表示不限制",
"the max package size fe thrift server can receive,avoid accepting
error"
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
index 02c85ffb39d..cdb869135a2 100755
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
@@ -1364,6 +1364,8 @@ public class Env {
editLog.logAddFirstFrontend(self);
initLowerCaseTableNames();
+ // Set initial root password if master FE first time launch.
+ auth.setInitialRootPassword(Config.initial_root_password);
} else {
if (journalVersion <= FeMetaVersion.VERSION_114) {
// if journal version is less than 114, which means it is
upgraded from version before 2.0.
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/Auth.java
b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/Auth.java
index 3d0c119f480..3696245d374 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/Auth.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/Auth.java
@@ -55,6 +55,7 @@ import org.apache.doris.datasource.InternalCatalog;
import org.apache.doris.ldap.LdapManager;
import org.apache.doris.ldap.LdapUserInfo;
import org.apache.doris.load.DppConfig;
+import org.apache.doris.mysql.MysqlPassword;
import org.apache.doris.persist.AlterUserOperationLog;
import org.apache.doris.persist.LdapInfo;
import org.apache.doris.persist.PrivInfo;
@@ -70,6 +71,7 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -1349,6 +1351,29 @@ public class Auth implements Writable {
}
}
+ public void setInitialRootPassword(String initialRootPassword) {
+ // Skip set root password if `initial_root_password` set to empty
string
+ if (StringUtils.isEmpty(initialRootPassword)) {
+ return;
+ }
+ byte[] scramble;
+ try {
+ scramble = MysqlPassword.checkPassword(initialRootPassword);
+ } catch (AnalysisException e) {
+ // Skip set root password if `initial_root_password` is not valid
2-staged SHA-1 encrypted
+ LOG.warn("initial_root_password [{}] is not valid 2-staged SHA-1
encrypted, ignore it",
+ initialRootPassword);
+ return;
+ }
+ UserIdentity rootUser = new UserIdentity(ROOT_USER, "%");
+ rootUser.setIsAnalyzed();
+ try {
+ setPasswordInternal(rootUser, scramble, null, false, false, false);
+ } catch (DdlException e) {
+ LOG.warn("Fail to set initial root password, ignore it", e);
+ }
+ }
+
public List<List<String>> getRoleInfo() {
readLock();
try {
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/AuthTest.java
b/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/AuthTest.java
index 10fa234607d..8e7a0508dbf 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/AuthTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/AuthTest.java
@@ -39,6 +39,7 @@ import org.apache.doris.common.DdlException;
import org.apache.doris.common.ExceptionChecker;
import org.apache.doris.common.UserException;
import org.apache.doris.datasource.InternalCatalog;
+import org.apache.doris.mysql.MysqlPassword;
import org.apache.doris.persist.EditLog;
import org.apache.doris.persist.PrivInfo;
import org.apache.doris.qe.ConnectContext;
@@ -2335,4 +2336,21 @@ public class AuthTest {
Lists.newArrayList(new
AccessPrivilegeWithCols(AccessPrivilege.DROP_PRIV)));
revoke(revokeStmt);
}
+
+ @Test
+ public void testSetInitialRootPassword() {
+ // Skip set root password if `initial_root_password` set to empty
string
+ auth.setInitialRootPassword("");
+ Assert.assertTrue(
+ auth.checkPlainPasswordForTest("root", "192.168.0.1", null,
null));
+ // Skip set root password if `initial_root_password` is not valid
2-staged SHA-1 encrypted
+ auth.setInitialRootPassword("invalidRootPassword");
+ Assert.assertTrue(
+ auth.checkPlainPasswordForTest("root", "192.168.0.1", null,
null));
+ // Set initial root password
+ byte[] scrambled =
MysqlPassword.makeScrambledPassword("validRootPassword");
+ auth.setInitialRootPassword(new String(scrambled));
+ Assert.assertTrue(
+ auth.checkPlainPasswordForTest("root", "192.168.0.1",
"validRootPassword", null));
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]