您查看的文章来源于http://www.oklinux.cn
清单 18. 典型的域套接字
robert@wolf:~$ ls -la /tmp|grep PGSQLsrwxrwxrwx 1 robert robert 0 2007-10-15 12:47 .s.PGSQL.5432-rw------- 1 robert robert 33 2007-10-15 12:47 .s.PGSQL.5432.lock
注意,端口号被附加到文件名的末尾。将服务器重新配置为使用一个不同的 TCP/IP 端口也将改变域套接字的名称。
postgresql.conf 配置文件中的三个参数将控制对域套接字的权限:
?unix_socket_directory(文件 PATH)
?unix_socket_group(用户组)
?unix_socket_permissions(默认为 0777)
域套接字的位置因 Linux 发行版而异:
?PostgreSQL 源代码安装并将套接字放到 /tmp 目录。
?BSD 将套接字放到 /tmp 目录。
?RedHat 衍生系统将套接字放到 /tmp 目录。
?Debian 衍生系统将套接字放到 /var/run/postgresql 且只具有对 postgresqlaccount 的权限。
域套接字有一些比较特别的方面。考虑下面这个例子。
在 robert(超级用户)的主目录中创建一个集群,并对可信性进行了验证。但是,在服务器启动时,域套接字的权限只允许除 robert 以外的用户登录。用户 robert 使用 TCP 登录,但是被域套接字拒绝。然而,robert 在对 nobody 执行 sudo 后,他就可以通过域套接字登录。
这个例子展示了文件权限的多样性,从而减轻由于骇客成为超级用户而引起的破坏。
清单 19. 权限
robert@wolf:~$ initdb -A trust -U postgres ~/datarobert@wolf:~$ pg_ctl -D ~/data/ -l ~/logfile.txt \-o "-c unix_socket_permissions=007 -c unix_socket_directory=/tmp" startserver startingrobert@wolf:~$ psql -h localhost -U postgres -c "select 'superuser:this works' as msg" msg---------------------- superuser:this works(1 row)robert@wolf:~$ psql -h /tmp -U postgres -c "select 'superuser:this fails' as msg"psql: could not connect to server: Permission denied Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"?robert@wolf:~$ sudo su nobody[sudo] password for robert:$ psql -h localhost -U postgres -c "select 'nobody:this works' as msg" msg------------------- nobody:this works(1 row)$ psql -h /tmp -U postgres -c "select 'nobody:this still works' as msg" msg------------------------- nobody:this still works(1 row)