![限制远程用户只能访问远程数据库的方法](https://linux22.com/image/6964/%E9%99%90%E5%88%B6%E8%BF%9C%E7%A8%8B%E7%94%A8%E6%88%B7%E5%8F%AA%E8%83%BD%E8%AE%BF%E9%97%AE%E8%BF%9C%E7%A8%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E6%96%B9%E6%B3%95.png)
我希望能够设置一个可以更新生产服务器上的 PostgreSQL 数据库的远程用户。
我有两台机器,一台是本地服务器,我用作命令和控制系统,名为Controlling_Machine
.这台机器用于登录Remote_Server
在生产中运行的我的远程服务器()并更新数据库Database_A
。
术语
Controlling_Machine
:可以访问互联网的 Linux 机器,但站点位于防火墙后面并且不接受传入连接。 (无法远程访问。)
Remote_Server
:在云中运行的 Centos 或 Ubuntu 生产虚拟机。
DB_User
:PostgreSQL 上只能写入一个特定数据库的用户帐户。
Server_User
:通过 SSH 连接到服务器的用户帐户。
Database_A
:我想通过控制机远程更新数据库。
到目前为止我想到了两种实现远程访问数据库的方法
1.使用远程用户和本地数据库用户的组合
通过 SSH登录Server_User
服务器并限制除主文件夹之外的所有读取访问权限。然后,该用户可以为此目的使用 登录数据库DB_User
。
我不希望
Server_User
能够读取任何其他文件夹,不是 /etc 不是 /media 除了 home 之外什么都没有。我希望他们受到严格限制。我不希望该用户能够查看正在运行的进程或访问其他任何内容。
我的想法是,如果
Controlling_Machine
启动Server_User
受到损害并且攻击者登录Remote_Server
,我想确保他们能造成的唯一损害是Database_A
。
整个过程是:
Controlling_Machine
-> Remote_Server
->Database_A
2. 使用远程数据库用户并将 PostgreSQL 公开到公共互联网
实现此结果的另一种可能更简单的方法是启用 PostgreSQL 数据库公共访问,以便我可以使用数据库用户登录。这意味着我不必仅为 建立另一个用户Remote_Server
,因为它不再参与交易。
但这与远程用户 SSH 设置一样安全吗
Remote_Server
?我想为此使用私钥/公钥。我可以将 PostgreSQL 设置为仅允许远程访问一个数据库吗?
整个过程是:
Controlling_Machine
->Database_A
什么更安全?
我想尽可能使用最安全的方法。如果将 PostgreSQL 放在我的公共 IP 上风险太大,那么我将不得不将数据库访问保留在生产服务器本地并通过 SSH 远程登录。
另外,如果这是最安全的方法,我如何限制这个远程Linux用户只能在本地登录PostgreSQL DB_User
(一旦它通过SSH远程登录Server_User
)
答案1
我会选择使用ssh
并限制该用户可以运行的命令。至少这样你就知道连接是安全的。您可以通过以下条目执行此操作/etc/ssh/sshd_config
:
Match User your_user
X11Forwarding no
AllowTcpForwarding no
ForceCommand your-command arg1 arg2
如果您通过参数可以强制your-command
使用您选择的数据库,这可能对您有用。 (或者,您可以根据 Server_User 的公钥在authorized_keys 文件中执行此操作)。
我不知道 PostgreSQL 的详细信息,但有可能在您用来操作数据库的命令行工具中,您可以只更改正在处理的数据库。如果是这样,你将无法限制事情。它甚至可能会暂时打开一个(bash)子 shell,这对于您的情况来说是一个更大的问题。
因此,我首先会看看您希望用户做什么。如果仅限于进行备份、恢复备份和一些其他功能,那么创建一个仅限于执行此功能的小程序,或者仅允许使用命令将命令文件复制到服务器可能更有意义。 cron 作业然后处理命令(并丢弃允许的内容之外的任何内容)。