PostgreSQL认证系统在pg_hba.conf
中进行管理。多个authentication mechanisms可以根据如何建立连接的被配置,向其中数据库并且通过该用户。
来自MySQL背景的令人惊讶的是Linux安装中经常使用的默认配置:它默认使用peer
身份验证进行本地连接。
这里有一个Debian/Ubuntu系统上的缺省值:
# Database administrative login by Unix domain socket
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
其结果是,如果我创建了一个用户和DB如下(登录为postgres
):
[email protected]:~$ createuser -S -D -R -P myuser
Enter password for new role:
Enter it again:
[email protected]:~$ createdb -E UTF-8 -O myuser mydb
这将尝试使用Unix套接字连接,并不能因为我米仍然登录作为postgres
,而不是作为myuser
(其可以或可以不甚至在该系统上存在):在Linux的SHEL
[email protected]:~$ psql -U myuser mydb
psql: FATAL: Peer authentication failed for user "myuser"
(如果我已经登录作为myuser
。L,它会工作)
相反,如果我明确指定我想通过网络连接(虽然127.0.0.1
),提示我输入密码,我可以登录:
[email protected]:~$ psql -U myuser -h 127.0.0.1 mydb
Password for user myuser:
psql (9.1.20)
SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.
mydb=>
trust
机制是一种呈现最大安全风险的机制,因为它不检查任何内容,而是检查该线路上的连接模式。
例如:
# This will let any local user connect to any DB via the Unix socket
# without any authentication:
local all all trust
# This will let any user connect to any DB via 127.0.0.1
# without any authentication:
host all all 127.0.0.1/32 trust
# And worse (DO NOT USE):
# This will let any user connect to any DB from anywhere
# without any authentication:
host all all 0.0.0.0/0 trust
有没有除了重置丢失postgres
(管理员)的密码,其中使用trust
是有道理的情况很多。
作为一个侧面说明,你说你用它来改变psql
密码:
postgres=# ALTER USER flasktut WITH PASSWORD 'zx80xb1';
ALTER ROLE
这工作确实,但也有一对夫妇的副作用:密码是现在可能会在~/.psql_history
中清楚地记录下来,并且它也可能在服务器端(无论发送日志的哪个地方)都被记录。
在psql
,通常最好使用\password
命令:
postgres=# \password flasktut
Enter new password:
Enter it again:
这不会离开密码的一丝清晰的日志或历史。
当你创建一个用户时,你必须将他授予一个分贝,然后当用户尝试登录时,他必须指定他尝试访问的数据库。除非他是超级用户。你如何创建用户? –
_Peer身份验证_在没有密码的情况下发生。请参阅http://www.postgresql。org/docs/current/static/auth-pg-hba-conf.html,并将您的配置调整为最适合您需求的安全策略。 –
你如何连接到服务器?编写你运行的psql命令。服务器是在本地机器还是远程机器上运行?如果它位于本地主机上,您是通过域套接字还是IP连接?查看pg_hba.conf文件。那里列出了所有登录方案及其身份验证方法。 – kliron