如何在Ubuntu 16.04上保护OrientDB数据库

2018-08-02 10:07:21 浏览数 (1)

介绍

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标签:

/opt/orientdb/config/orientdb-server-config.xml

代码语言:txt复制
. . .
<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

/opt/orientdb/config/orientdb-server-config.xml

代码语言:txt复制
<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,但它甚至不需要设置执行位。

代码语言:txt复制
$ 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数据库。初始情况下,每个服务器实例都带有两个用户帐户:guestroot。首次安装和启动OrientDB服务器时,您可以选择设置root帐户密码。密码的散列形式存储在OrientDB配置文件/opt/orientdb/config/orientdb-server-config.xml中。guest帐户的自动生成密码的散列形式也存储在该文件中。

在OrientDB控制台中,您可以通过输入以下内容来查看有关两个帐户的信息:

代码语言:txt复制
orientdb> list server users

注意:OrientDB中当前存在一个错误,当您尝试运行list server users时会导致以下错误:

代码语言:txt复制
Error: com.orientechnologies.orient.core.exception.OConfigurationException: Cannot access to file ../config/orientdb-server-config.xml

如果收到此错误,可以通过退出OrientDB控制台并在移动到bin目录后重新连接来解决此问题。

代码语言:txt复制
$ 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命令。

代码语言:txt复制
orientdb> drop server user guest

下次当您从OrientDB控制台list server users,它将只显示root用户。如果您查看/opt/orientdb/config/orientdb-server-config.xml文件内部,您会看到guest帐户已从用户标记中删除。

现在服务器实例已更安全,接下来您将使数据库本身更安全。

第三步 - 限制对OrientDB数据库的访问

保护OrientDB安装的下一步是使得很难对数据库本身进行未经授权的访问。

默认情况下,您创建的每个OrientDB数据库都有三个内置帐户,其中包含以下用户名:adminreaderwriter,每个帐户的密码与用户名相同。这适用于测试,但不适用于生产系统。至少,您应该更改所有三个帐户的密码。您应该删除或暂停任何您不需要的东西。

您选择如何管理这些帐户取决于您的需求和环境。在本教程中,您将学习如何更改admin帐户的密码,暂停writer帐户以及删除reader帐户。您可以从OrientDB控制台和基于浏览器的OrientDB Studio执行这三个操作中的任何一个。

从OrientDB控制台管理用户帐户

要从控制台更改用户帐户,您需要连接到要管理其帐户的数据库。此示例使用admin用户和默认密码(admin)连接到GratefulDeadConcerts数据库,即每个OrientDB安装附带的示例数据库:

代码语言:txt复制
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

代码语言:txt复制
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帐户的密码:

  1. 单击其“ 操作”列下的“ 编辑 ” ,这将显示一个小的“ 编辑用户”窗口。
  2. 密码字段中更改密码
  3. 单击“ 保存用户”

要删除reader帐户:

  1. 单击帐户“ 操作”列中的“ 删除”按钮。

要暂停writer帐户:

  1. 单击其“ 操作”列下的“ 编辑 ” ,这将显示一个小的“ 编辑用户”窗口。
  2. “状态”下拉菜单中,选择"暂停”
  3. 单击“ 保存用户”

在下一步中,您将学习如何在静态时加密OrientDB数据库。

第四步 - 加密OrientDB数据库

OrientDB支持加密数据库,保证您存储数据的额外安全性。您只能在创建OrientDB数据库时进行访问;如果需要加密现有数据库,则必须将其导出并导入加密数据库。对于本节,我们将完成指定在创建时加密数据库的过程。

OrientDB支持AES和DES加密算法,但AES更受欢迎,因为它更强大。我们需要设置加密密钥,创建数据库,并指定加密方法(AES或DES)。请注意,加密密钥的长度必须为24个字符,后两个字符必须为==

要生成加密密钥,您可以使用pwgen密码生成工具。

代码语言:txt复制
$ 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》

0 人点赞