如何设置 SSH 用户只是为了访问 postgres 而不执行其他操作

如何设置 SSH 用户只是为了访问 postgres 而不执行其他操作

我需要授予某人对 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。

相关内容