我需要授予某人对 ubuntu 18.04 服务器内的 postgres 的只读访问权限
对于 postgres 我做了以下操作
CREATE ROLE read_only_user WITH LOGIN PASSWORD 'FAKEPASSWORD123' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION VALID UNTIL 'infinity';
GRANT CONNECT ON DATABASE "somedb" TO read_only_user;
GRANT USAGE ON SCHEMA public TO read_only_user;
在 SSH 上/etc/ssh/sshd_config
PasswordAuthentication no
PermitRootLogin no
在ubuntu上我这样做了
sudo mkdir /var/read_only_on_ubuntu_user
sudo groupadd read_only
sudo usermod -g read_only read_only_on_ubuntu_user
sudo useradd -d /var/read_only_on_ubuntu_user read_only_on_ubuntu_user
sudo chown read_only_on_ubuntu_user:read_only /var/read_only_on_ubuntu_user
cd /var/read_only_on_ubuntu_user && mkdir .ssh
vim .ssh/authorized_keys # this is to add the public key for this user account
该用户通过 SSH 成功访问 localhost:5432 上的 postgres
我还能做什么来进一步限制该用户?
更新
忘记补充一点,用户当前使用桌面 GUI 应用程序,该应用程序通过隧道连接到服务器,然后通过 SSH 从自己的桌面远程访问数据库。
他们不会通过 SSH 登录然后运行 psql。虽然他们下次可能会要求这样做,但我认为极不可能
答案1
添加ForceCommand
到运行客户端(在您的情况下)的 sshd_config (您可以将其包含到匹配块中,以便它只影响该用户)psql
。
或者,您可以authorized_keys
通过在文件前面添加command="..."
.您可能还应该restrict
在那里添加标志,然后添加pty
.
另一种方法是,不让用户在远程服务器上执行 psql,而是让他们执行 ssh 连接,该连接只允许他们创建到正在运行的 quere postgresql 本地主机端口的隧道,并让他们在本地连接到它。
答案2
如果您只想允许隧道,请将以下内容添加到您的/etc/ssh/sshd_config
:
Match User myusername
# PasswordAuthentication yes
PermitOpen 127.0.0.1:5432
X11Forwarding no
AllowAgentForwarding no
ForceCommand /bin/false
PasswordAuthentication yes
如果该用户需要密码才能登录,则取消注释,但其他人不得使用密码登录。
-N
这需要在使用 SSH 客户端时使用连接。否则,服务器将向用户打招呼,然后断开连接。
以下将连接到上面的配置并打开隧道。然后可以在10123
本地计算机上的端口上访问 Postgres。
ssh -N -L 10123:localhost:5432 myusername@myserver
答案3
使用受限制的 shell,例如壳牌,对于用户来说。这允许您指定 shell 将允许的命令白名单(并且限制也适用于从 psql 客户端内部启动的 shell)。
使用 chsh 命令设置用户的 shell。