介绍
OrientDB是一个多模型的NoSQL数据库,支持文档和图形数据库。它是一个Java应用程序,可以在任何操作系统上运行。它也完全支持ACID,支持多主复制。
初始情况下,OrientDB具有非常好的安全状态,因为连接到服务器实例并连接到数据库都需要身份验证。它还支持其他安全方案,如Kerberos身份验证和LDAP用户,但它们涉及到设置其他软件系统。
在本文中,我们将重点关注仅使用默认情况下可用资源来保护OrientDB社区版的安装。具体来说,您将加密OrientDB数据库,限制对OrientDB Web服务器和服务器实例的访问,并从Web UI和控制台管理OrientDB数据库帐户。
准备
要学习本教程,您需要具备以下条件:
- 一个Ubuntu 16.04服务器并设置了一个可以使用sudo命令的非root用户和防火墙。
- 在服务器上安装OrientDB Community Edition,安装教程详见腾讯云社区。
本文假定OrientDB安装在/opt/orientdb
目录中,与原始安装文章中一样。/opt
是在Linux中安装第三方应用程序的传统位置。
第一步 - 限制对OrientDB Web服务器的访问
OrientDB是一个常规的Web服务器应用程序,但它不打算暴露给Internet或公共网络。对它的管理访问必须局限于本地网络。
运行安全的OrientDB应用程序的第一步是保护正在运行的操作系统。此时您应该运行防火墙。最初的OrientDB安装教程通过端口2480
设定防火墙允许从公共网络访问OrientDB Studio以进行测试。
如果您想确保始终拒绝从Internet访问OrientDB Studio和控制台,无论防火墙设置如何,您只需对以下配置文件进行一些更改,/opt/orientdb/config/orientdb-server-config.xml
。
打开该文件进行编辑。
代码语言:txt复制$ sudo nano /opt/orientdb/config/orientdb-server-config.xml
然后寻找listeners
标签:
代码语言:txt复制/opt/orientdb/config/orientdb-server-config.xml
. . .
<listeners>
<listener protocol="binary" socket="default" port-range="2424-2430" ip-address="0.0.0.0"/>
<listener protocol="http" socket="default" port-range="2480-2490" ip-address="0.0.0.0">
. . .
</listeners>
. . .
并将ip-address
参数0.0.0.0
更改为127.0.0.1
。
代码语言:txt复制/opt/orientdb/config/orientdb-server-config.xml
<listeners>
. . .
<listener protocol="binary" socket="default" port-range="2424-2430" ip-address="127.0.0.1"/>
<listener protocol="http" socket="default" port-range="2480-2490" ip-address="127.0.0.1">
. . .
</listeners>
. . .
保存并关闭文件。
在OrientDB守护程序运行时对配置文件进行更改时,请务必重新启动它:
代码语言:txt复制$ sudo systemctl restart orientdb
这切断了从公共互联网到Studio的所有连接。现在,再次访问浏览器http://your_server_ip:2480
,尝试连接到Studio。这次,连接将被拒绝。
在此步骤中,您将重点放在外部网络的安全性上。在下一步中,您将更安全地在内部使OrientDB服务器实例。
第二步 - 保护OrientDB服务器实例
在这里,您将学习如何删除访客帐户并修改OrientDB配置文件的权限。
为提高服务器安全性,您可以做的一件事是只向OrientDB用户提供对config
目录的读写访问权限。该目录的默认权限是755
,但它甚至不需要设置执行位。
$ sudo chmod 600 /opt/orientdb/config
强化配置文件本身的权限。
代码语言:txt复制$ sudo chmod 600 /opt/orientdb/config/orientdb-server-config.xml
本教程中的其他安全提示将通过OrientDB控制台完成,因此请立即连接。
代码语言:txt复制$ sudo /opt/orientdb/bin/console.sh
每个OrientDB服务器实例都可以支持多个OrientDB数据库。初始情况下,每个服务器实例都带有两个用户帐户:guest和root。首次安装和启动OrientDB服务器时,您可以选择设置root帐户密码。密码的散列形式存储在OrientDB配置文件/opt/orientdb/config/orientdb-server-config.xml
中。guest帐户的自动生成密码的散列形式也存储在该文件中。
在OrientDB控制台中,您可以通过输入以下内容来查看有关两个帐户的信息:
代码语言:txt复制orientdb> list server users
代码语言:txt复制注意:OrientDB中当前存在一个错误,当您尝试运行list server users时会导致以下错误:
Error: com.orientechnologies.orient.core.exception.OConfigurationException: Cannot access to file ../config/orientdb-server-config.xml
如果收到此错误,可以通过退出OrientDB控制台并在移动到bin
目录后重新连接来解决此问题。
$ cd /opt/orientdb/bin
$ sudo ./console.sh
然后你可以运行list server users
,它将按预期工作。
输出结果将告诉您两个帐户具有哪些权限。该guest帐户具有有限的权限,但允许root用户可以执行所有任务。这就是代替其权限的星号表示:
代码语言:txt复制SERVER USERS
- 'guest', permissions: connect,server.listDatabases,server.dblist
- 'root', permissions: *
即使权限有限,您也可能不想保留guest帐户。要从控制台删除它,请使用drop
命令。
orientdb> drop server user guest
下次当您从OrientDB控制台list server users
,它将只显示root用户。如果您查看/opt/orientdb/config/orientdb-server-config.xml
文件内部,您会看到guest帐户已从用户标记中删除。
现在服务器实例已更安全,接下来您将使数据库本身更安全。
第三步 - 限制对OrientDB数据库的访问
保护OrientDB安装的下一步是使得很难对数据库本身进行未经授权的访问。
默认情况下,您创建的每个OrientDB数据库都有三个内置帐户,其中包含以下用户名:admin,reader和writer,每个帐户的密码与用户名相同。这适用于测试,但不适用于生产系统。至少,您应该更改所有三个帐户的密码。您应该删除或暂停任何您不需要的东西。
您选择如何管理这些帐户取决于您的需求和环境。在本教程中,您将学习如何更改admin帐户的密码,暂停writer帐户以及删除reader帐户。您可以从OrientDB控制台和基于浏览器的OrientDB Studio执行这三个操作中的任何一个。
从OrientDB控制台管理用户帐户
要从控制台更改用户帐户,您需要连接到要管理其帐户的数据库。此示例使用admin用户和默认密码(admin)连接到GratefulDeadConcerts
数据库,即每个OrientDB安装附带的示例数据库:
orientdb> connect remote:127.0.0.1/GratefulDeadConcerts admin admin
或者,您也可以使用OrientDB服务器的root帐户和密码进行连接。在任何一种情况下,都应该更改提示以指示您已连接到特定数据库。
代码语言:txt复制Connecting to database [remote:127.0.0.1/GratefulDeadConcerts] with user 'admin'...OK
orientdb {db=GratefulDeadConcerts}>
要列出数据库的用户,请输入以下内容。ouser是存储用户密码的OrientDB记录:
代码语言:txt复制orientdb {db=GratefulDeadConcerts}> select from ouser
完整输出结果应如下。请注意,所有三个帐户都具有ACTIVE状态。
代码语言:txt复制 ---- ---- ------ ------ ----------------------------------------------------------------------------------------------------------------------------- ------ ------
|# |@RID|@CLASS|name |password |status|roles |
---- ---- ------ ------ ----------------------------------------------------------------------------------------------------------------------------- ------ ------
|0 |#5:0|OUser |admin |{PBKDF2WithHmacSHA256}6668FC52BF1D2883BEB4DC3A0468F734EA251E6D5B13AC51:39B1E812DEC299DC029A7922E206ED674EB52A6D6E27FE84:65536|ACTIVE|[#4:0]|
|1 |#5:1|OUser |reader|{PBKDF2WithHmacSHA256}1168D930D370A0FB1B6FA11CAFF928CCB412A153C127C25F:0C287793DF156FB72E6E2D9D756E616995BBAC495D4A1616:65536|ACTIVE|[#4:1]|
|2 |#5:2|OUser |writer|{PBKDF2WithHmacSHA256}22D3068CC3A39C08A941B4BF8B4CEB09D2609C20661529E3:8D6DA7FB4AF329234CA643663172EE913764E3096F63D007:65536|ACTIVE|[#4:2]|
---- ---- ------ ------ ----------------------------------------------------------------------------------------------------------------------------- ------ ------
3 item(s) found. Query executed in 0.736 sec(s).
要更改admin用户的密码,请使用以下命令:
代码语言:txt复制orientdb {db=GratefulDeadConcerts}> update ouser set password = 'new_account_password' where name = 'admin'
要禁用writer用户,请将状态更改ACTIVE为SUSPENDED
。
orientdb {db=GratefulDeadConcerts}> update ouser set status= 'SUSPENDED' where name = 'writer'
要完全从数据库中删除reader帐户,请使用:
代码语言:txt复制orientdb {db=GratefulDeadConcerts}> drop user reader
如果您执行了上述所有操作并再次查看帐户列表,您将看到以下输出结果。其中一个帐户丢失,另一个帐户被暂停:
代码语言:txt复制 ---- ---- ------ ------ ----------------------------------------------------------------------------------------------------------------------------- --------- ------
|# |@RID|@CLASS|name |password |status |roles |
---- ---- ------ ------ ----------------------------------------------------------------------------------------------------------------------------- --------- ------
|0 |#5:0|OUser |admin |{PBKDF2WithHmacSHA256}6668FC52BF1D2883BEB4DC3A0468F734EA251E6D5B13AC51:39B1E812DEC299DC029A7922E206ED674EB52A6D6E27FE84:65536|ACTIVE |[#4:0]|
|1 |#5:2|OUser |writer|{PBKDF2WithHmacSHA256}22D3068CC3A39C08A941B4BF8B4CEB09D2609C20661529E3:8D6DA7FB4AF329234CA643663172EE913764E3096F63D007:65536|SUSPENDED|[#4:2]|
---- ---- ------ ------ ----------------------------------------------------------------------------------------------------------------------------- --------- ------
完成所有用户管理任务后,您可以通过输入以下内容与数据库断开连接(即关闭它):
代码语言:txt复制orientdb {db=GratefulDeadConcerts}> disconnect
从OrientDB Studio管理OrientDB用户帐户
在本节中,您将学习如何从OrientDBStudio管理OrientDB用户帐户。首先,通过访问http://your_server_ip:2480
启动工作室。如果您在第一步中限制了对Studio的访问权限,则需要重新允许它。
您将看到的第一个屏幕是登录屏幕。使用root和安装OrientDB时的密码登录。登录后,单击“安全”选项卡。在该页面上,您将看到所有三个默认用户。
要更改admin帐户的密码:
- 单击其“ 操作”列下的“ 编辑 ” ,这将显示一个小的“ 编辑用户”窗口。
- 在密码字段中更改密码。
- 单击“ 保存用户”。
要删除reader帐户:
- 单击帐户“ 操作”列中的“ 删除”按钮。
要暂停writer帐户:
- 单击其“ 操作”列下的“ 编辑 ” ,这将显示一个小的“ 编辑用户”窗口。
- 在“状态”下拉菜单中,选择"暂停”。
- 单击“ 保存用户”。
在下一步中,您将学习如何在静态时加密OrientDB数据库。
第四步 - 加密OrientDB数据库
OrientDB支持加密数据库,保证您存储数据的额外安全性。您只能在创建OrientDB数据库时进行访问;如果需要加密现有数据库,则必须将其导出并导入加密数据库。对于本节,我们将完成指定在创建时加密数据库的过程。
OrientDB支持AES和DES加密算法,但AES更受欢迎,因为它更强大。我们需要设置加密密钥,创建数据库,并指定加密方法(AES或DES)。请注意,加密密钥的长度必须为24个字符,后两个字符必须为==
。
要生成加密密钥,您可以使用pwgen
密码生成工具。
$ sudo apt-get install pwgen
然后使用以下命令生成一个以==结尾的单个24个字符的键:
代码语言:txt复制$ echo `pwgen 22 1`==
请记住将此密钥存储在安全的地方,就像您输入密码一样。要为要创建的新数据库设置加密密钥,请在OrientDB控制台中输入以下内容:
代码语言:txt复制orientdb> config set storage.encryptionKey Ohjojiegahv3tachah9eib==
然后使用该密钥创建加密数据库。这将在本地文件系统(plocal)中创建基于文档的加密数据库。
代码语言:txt复制orientdb> create database plocal:/opt/orientdb/databases/name_of_encrypted_db root root_password plocal document -encryption=aes
您将自动连接到新数据库,提示将更改以反映该情况。要断开与数据库的连接,只需输入:
代码语言:txt复制orientdb {db=<span class= encrypted-db}>'>disconnect
请记住,用于加密OrientDB数据库的加密密钥不存储在系统上。每当您想要从控制台与数据库交互时,您都必须输入用于设置加密密钥的相同命令。
代码语言:txt复制orientdb> config set storage.encryptionKey Ohjojiegahv3tachah9eib==
然后打开数据库,您可以输入:
代码语言:txt复制orientdb> connect plocal:/opt/orientdb/databases/name_of_encrypted_db admin admin_password
请注意,虽然您可以从OrientDB Studio中创建新数据库,但您无法创建加密数据库。在发布时,您只能从控制台创建加密数据库。
结论
在本教程中,您已限制对OrientDB安装的访问,从控制台和Web UI管理用户帐户,并在静态时加密OrientDB数据库。这些是您可以用来增强OrientDB服务器和数据库的安全配置文件的基本但非常重要的安全配置,可以使用OrientDB远程代码执行漏洞分析。
参考文献:《How To Secure Your OrientDB Database on Ubuntu 16.04》