PostgreSQL: Làm cách nào để thay đổi mật khẩu người dùng PostgreSQL?


Câu trả lời:


1406

Đối với mật khẩu ít đăng nhập:

sudo -u user_name psql db_name

Để đặt lại mật khẩu nếu bạn quên:

ALTER USER user_name WITH PASSWORD 'new_password';

126
Điều này cho phép mật khẩu rõ ràng trong lịch sử lệnh postgresql của người dùng.
greg

118
@greg: vì vậy hãy xóa nó:rm ~/.psql_history
RickyA

43
lạc đề nhưng nếu bất cứ ai đang tìm kiếm "cách thay đổi tên người dùng" hơn là ALTER USER myuser RENAME TO newname;... vì một số lý do, google đã chỉ cho tôi ở đây khi tôi đang nói về điều đó :)
tương đương

10
Tại sao bạn lại sử dụng cả "và" dấu ngoặc kép? Ý tôi là, có một sự khác biệt và trong truy vấn DML bạn phải sử dụng 'khi xử lý chuỗi, nhưng có lý do đặc biệt nào để sử dụng cả hai ở đây không?
Boyan

7
Người dùng là một đối tượng, không phải là một chuỗi. So sánh với ALTER TABLE "tên_bảng" hoặc thậm chí CHỌN * TỪ "tên_bảng". Bạn không thể sử dụng các trích dẫn đơn trong các ngữ cảnh này với các bảng và nó cũng giống với người dùng / vai trò.
P Daddy

630

Sau đó gõ:

$ sudo -u postgres psql

Sau đó:

\password postgres

Sau đó để bỏ psql:

\q

Nếu điều đó không làm việc, cấu hình lại xác thực.

Chỉnh sửa /etc/postgresql/9.1/main/pg_hba.conf(đường dẫn sẽ khác nhau) và thay đổi:

    local   all             all                                     peer

đến:

    local   all             all                                     md5

Sau đó khởi động lại máy chủ:

$ sudo service postgresql restart

3
mật khẩu mặc định cho postgres là gì? thay đổi nó một cách vô tình; có thể thiết lập lại?
Saad

2
(trên psql 9.2) nếu tôi nhập \p, nó cung cấp cho tôi mật khẩu; nếu tôi gõ vào \password postgresnó sẽ cung cấp mật khẩu và sau đó cảnh báo\p extra argument "assword" ignored; \p extra argument "postgres" ignored
David LeBauer

1
Điều này tốt hơn nhiều so với việc để lại mật khẩu trong lịch sử lệnh SQL.
otocan

1
@ZacharyScott Bạn đang nói gì vậy?
TheRealChx101

2
Để thay đổi mật khẩu của người dùng postgres trong Linux:sudo passwd postgres
Punnerud

88

Bạn có thể và nên mã hóa mật khẩu của người dùng:

ALTER USER username WITH ENCRYPTED PASSWORD 'password';

45
Từ khóa này không quan trọng đối với phiên bản hiện tại. Từ postgresql.org/docs/civerse/static/sql-c[ole.html The password is always stored encrypted in the system catalogs. The ENCRYPTED keyword has no effect, but is accepted for backwards compatibility.
John29

5
Coi chừng! Nhận xét @ John29 chỉ đúng từ Postgresql 10 trở lên. Đối với tất cả các phiên bản khác, cờ ENCRYPTED có vấn đề.
phep

51

Tôi tin rằng cách tốt nhất để thay đổi mật khẩu chỉ đơn giản là sử dụng:

\password

trong bảng điều khiển Postgres.

Nguồn:

Cần thận trọng khi chỉ định mật khẩu không được mã hóa bằng lệnh này. Mật khẩu sẽ được truyền đến máy chủ ở dạng văn bản rõ ràng và mật khẩu cũng có thể được ghi vào lịch sử lệnh của máy khách hoặc nhật ký máy chủ. psql chứa một lệnh \ mật khẩu có thể được sử dụng để thay đổi mật khẩu của vai trò mà không làm lộ mật khẩu Cleartext.

từ https://www.postgresql.org/docs/9.0/static/sql-alterrole.html .


8
Điều này cũng có thể được sử dụng để thay đổi mật khẩu cho những người dùng khác:\password username
Martin

34

Để thay đổi mật khẩu bằng dòng lệnh Linux, hãy sử dụng:

sudo -u <user_name> psql -c "ALTER USER <user_name> PASSWORD '<new_password>';"

5
Chỉ cần nhớ rằng điều này có thể sẽ lưu mật khẩu người dùng của db trong lịch sử lệnh của bạn.
Pedro Cordeiro

2
bạn có thể sử dụng các biến môi trường ở đây? Tôi muốn tự động hóa điều này trong một kịch bản triển khai
TheRealChx101

26

Thay đổi mật khẩu

 sudo -u postgres psql

sau đó

\password postgres

Bây giờ hãy nhập Mật khẩu mới và Xác nhận

sau đó \qđể thoát


1
Câu trả lời này giúp tôi. cảm ơn
mohammad jawad Barati

24

Chuyển đến Cấu hình Postgresql của bạn và Chỉnh sửa pg_hba.conf

sudo vim /etc/postgresql/9.3/main/pg_hba.conf

Sau đó thay đổi dòng này:

Database administrative login by Unix domain socket
local      all              postgres                                md5

đến :

Database administrative login by Unix domain socket
local   all             postgres                                peer

sau đó khởi động lại dịch vụ PostgreSQL thông qua lệnh SUDO rồi

psql -U postgres

Bây giờ bạn sẽ được nhập và sẽ thấy thiết bị đầu cuối Postgresql

sau đó nhập

\password

và nhập Mật khẩu MỚI cho người dùng mặc định của Postgres, Sau khi thay đổi thành công Mật khẩu một lần nữa, hãy truy cập pg_hba.conf và hoàn nguyên thay đổi thành "md5"

bây giờ bạn sẽ đăng nhập như

postgres psql

với Mật khẩu mới của bạn.

Hãy cho tôi biết nếu tất cả các bạn tìm thấy bất kỳ vấn đề trong đó.


Nó không hoạt động:user@user-NC10:~$ psql -U postgres psql: FATAL: Peer authentication failed for user "postgres"
GM

Ok, Thực hiện một phương pháp khác sudo su - postgres psql Bạn sẽ nhập thiết bị đầu cuối và sau đó thay đổi mật khẩu ở đó, Đây là một cách thay thế cho việc này. Hãy cho tôi biết nếu điều này làm việc cho bạn hoặc bạn cần một lời giải thích đầy đủ
Murtaza Kanchwala

mm tôi đã thử nhưng tôi có một lỗi khác: / usr / bin / psql: dòng 19: use: lệnh not find / usr / bin / psql: line 21: use: lệnh not find / usr / bin / psql: line 23: sử dụng: lệnh không tìm thấy / usr / bin / psql: dòng 24: use: lệnh không tìm thấy / usr / bin / psql: psql: dòng 26: lỗi cú pháp gần mã thông báo không mong muốn $version,' /usr/bin/psql: psql: line 26: của tôi (phiên bản $, $ cluster, $ db, $ port , $ máy chủ); ' Cảm ơn bạn đã giúp đỡ!
GM

11

Để yêu cầu mật khẩu mới cho người dùng postgres (không hiển thị trong lệnh):

sudo -u postgres psql -c "\password"

9

Cấu hình mà tôi có trên máy chủ của mình đã được tùy chỉnh rất nhiều và tôi chỉ quản lý để thay đổi mật khẩu sau khi tôi đặt xác thực tin cậy trong pg_hba.conftệp :

local   all   all   trust

Đừng quên đổi lại mật khẩu hoặc md5


1
bạn cũng cần khởi động lại dịch vụ postgres của mình để các thay đổi có hiệu lựcsudo systemctl restart postgresql.service
Sampath Surineni

Tập tin pg_hba.conf này nên đi đâu?
JMStudios.jrichardson

8

Đây là kết quả đầu tiên trên google, khi tôi đang tìm cách đổi tên người dùng, vì vậy:

ALTER USER <username> WITH PASSWORD '<new_password>';  -- change password
ALTER USER <old_username> RENAME TO <new_username>;    -- rename user

Một vài lệnh khác hữu ích cho việc quản lý người dùng:

CREATE USER <username> PASSWORD '<password>' IN GROUP <group>;
DROP USER <username>;

Chuyển người dùng sang nhóm khác

ALTER GROUP <old_group> DROP USER <username>;
ALTER GROUP <new_group> ADD USER <username>;

7

Đối với trường hợp của tôi trên Ubuntu 14.04 được cài đặt với postgres 10.3. Tôi cần làm theo các bước sau

  • su - postgres để chuyển người dùng sang postgres
  • psql để nhập vỏ postgres
  • \password sau đó nhập mật khẩu của bạn
  • \q bỏ phiên vỏ
  • Sau đó, bạn chuyển trở lại root bằng cách thực hiện exitvà định cấu hình pg_hba.conf(của tôi là tại /etc/postgresql/10/main/pg_hba.conf) bằng cách đảm bảo bạn có dòng sau

    local all postgres md5

  • Khởi động lại dịch vụ postgres của bạn bằng cách service postgresql restart
  • Bây giờ chuyển sang postgresngười dùng và nhập vỏ postgres một lần nữa. Nó sẽ nhắc bạn bằng mật khẩu.

Tôi không nghĩ rằng bạn thực sự cần phải khởi động lại dịch vụ postgresql sau khi thay đổi mật khẩu. Tôi đã có thể thiết lập lại mật khẩu bằng cách khởi động lại nó. \ mật khẩu là cách nhanh nhất. Hoặc nếu không, bạn cần lệnh ALTER USER.
Archit Kapoor

3

dùng cái này:

\password

nhập mật khẩu mới bạn muốn cho người dùng đó và sau đó xác nhận nó. Nếu bạn không nhớ mật khẩu và bạn muốn thay đổi mật khẩu, bạn có thể đăng nhập dưới dạng postgres và sau đó sử dụng mật khẩu này:

ALTER USER 'the username' WITH PASSWORD 'the new password';

3

Tương tự như các câu trả lời khác theo cú pháp nhưng cần biết rằng bạn cũng có thể truyền md5 mật khẩu để bạn không truyền mật khẩu văn bản đơn giản.

Dưới đây là một vài tình huống về hậu quả không lường trước của việc thay đổi mật khẩu người dùng trong văn bản thuần túy.

  1. Nếu bạn không có SSL và đang sửa đổi từ xa, bạn đang truyền mật khẩu văn bản đơn giản trên mạng.
  2. Nếu bạn có cấu hình ghi nhật ký được đặt để ghi Báo cáo DDL log_statement = ddlhoặc cao hơn, thì mật khẩu văn bản đơn giản của bạn sẽ hiển thị trong nhật ký lỗi của bạn.
    1. Nếu bạn không bảo vệ những bản ghi này thì đó là một vấn đề.
    2. Nếu bạn thu thập các nhật ký này / ETL chúng và hiển thị chúng ở nơi người khác có quyền truy cập, cuối cùng họ có thể thấy mật khẩu này, v.v.
    3. Nếu bạn cho phép người dùng quản lý mật khẩu của họ, họ vô tình tiết lộ mật khẩu cho quản trị viên hoặc nhân viên cấp thấp được giao nhiệm vụ xem xét nhật ký.

Như đã nói ở đây là cách chúng ta có thể thay đổi mật khẩu của người dùng bằng cách xây dựng md5 mật khẩu.

  • Postgres khi băm mật khẩu là md5, muối mật khẩu với tên người dùng sau đó thêm văn bản "md5" vào băm kết quả.
  • ví dụ: "md5" + md5 (mật khẩu + tên người dùng)

  • Trong bash:

    ~$ echo -n "passwordStringUserName" | md5sum | awk '{print "md5"$1}'
    md5d6a35858d61d85e4a82ab1fb044aba9d
  • Trong PowerShell:
    [PSCredential] $Credential = Get-Credential

    $StringBuilder = New-Object System.Text.StringBuilder

    $null = $StringBuilder.Append('md5');

    [System.Security.Cryptography.HashAlgorithm]::Create('md5').ComputeHash([System.Text.Encoding]::ASCII.GetBytes(((ConvertFrom-SecureStringToPlainText -SecureString $Credential.Password) + $Credential.UserName))) | ForEach-Object {
        $null = $StringBuilder.Append($_.ToString("x2"))
    }

    $StringBuilder.ToString();

    ## OUTPUT
    md5d6a35858d61d85e4a82ab1fb044aba9d
  • Vì vậy, cuối cùng ALTER USERlệnh của chúng tôi sẽ trông giống như
    ALTER USER UserName WITH PASSWORD 'md5d6a35858d61d85e4a82ab1fb044aba9d';
  • Các liên kết có liên quan (Lưu ý tôi sẽ chỉ liên kết đến các phiên bản mới nhất của tài liệu cũ hơn, nó thay đổi một số nhưng md5 vẫn hỗ trợ một cách quay lại.)
  • tạo vai trò
  • Mật khẩu luôn được lưu trữ được mã hóa trong danh mục hệ thống. Từ khóa ENCRYPTED không có hiệu lực, nhưng được chấp nhận để tương thích ngược. Phương thức mã hóa được xác định bởi tham số cấu hình password_encoding. Nếu chuỗi mật khẩu được trình bày đã ở định dạng MD5 - được mã hóa hoặc mã hóa SCRAM, thì nó được lưu trữ dưới dạng bất kể password_encoding (vì hệ thống không thể giải mã chuỗi mật khẩu được mã hóa đã chỉ định, để mã hóa nó ở định dạng khác). Điều này cho phép tải lại mật khẩu được mã hóa trong quá trình kết xuất / khôi phục.

  • cài đặt cấu hình cho password_encoding
  • postgres mật khẩu xác thực doc
  • xây dựng mật khẩu postgres md5

1

Nói chung, chỉ cần sử dụng UI quản trị pg để thực hiện hoạt động liên quan đến db.

Thay vào đó, nếu bạn tập trung hơn vào việc tự động hóa thiết lập cơ sở dữ liệu để phát triển cục bộ hoặc CI, v.v ...

Ví dụ, bạn có thể sử dụng một kết hợp đơn giản như thế này.

(a) Tạo một siêu người dùng giả thông qua jenkins với một lệnh tương tự như sau:

docker exec -t postgres11-instance1 createuser --username=postgres --superuser experiment001

điều này sẽ tạo ra một siêu người dùng có tên là Exper001 trong bạn postgres db.

(b) Cung cấp cho người dùng này một số mật khẩu bằng cách chạy lệnh NON-Interactive SQL.

docker exec -t postgres11-instance1 psql -U experiment001 -d postgres -c "ALTER USER experiment001 WITH PASSWORD 'experiment001' "

Postgres có lẽ là cơ sở dữ liệu tốt nhất hiện có cho công cụ dòng lệnh (không tương tác). Tạo người dùng, chạy SQL, tạo bản sao lưu cơ sở dữ liệu, v.v ... Nói chung tất cả đều khá cơ bản với postgres và nói chung là khá đơn giản để tích hợp điều này vào các tập lệnh thiết lập phát triển của bạn hoặc vào cấu hình CI tự động.


1

và cách hoàn toàn tự động với bash và mong đợi ( trong ví dụ này, chúng tôi cung cấp một quản trị viên postgres mới với các postgres mới được cung cấp ở cả mức độ thời gian chạy của OS và postgres)

  # the $postgres_usr_pw and the other bash vars MUST be defined 
  # for reference the manual way of doing things automated with expect bellow
  #echo "copy-paste: $postgres_usr_pw"
  #sudo -u postgres psql -c "\password"
  # the OS password could / should be different
  sudo -u root echo "postgres:$postgres_usr_pw" | sudo chpasswd

  expect <<- EOF_EXPECT
     set timeout -1
     spawn sudo -u postgres psql -c "\\\password"
     expect "Enter new password: "
     send -- "$postgres_usr_pw\r"
     expect "Enter it again: "
     send -- "$postgres_usr_pw\r"
     expect eof
EOF_EXPECT

  cd /tmp/
  # at this point the postgres uses the new password
  sudo -u postgres PGPASSWORD=$postgres_usr_pw psql \
    --port $postgres_db_port --host $postgres_db_host -c "
  DO \$\$DECLARE r record;
     BEGIN
        IF NOT EXISTS (
           SELECT
           FROM   pg_catalog.pg_roles
           WHERE  rolname = '"$postgres_db_useradmin"') THEN
              CREATE ROLE "$postgres_db_useradmin" WITH SUPERUSER CREATEROLE
              CREATEDB REPLICATION BYPASSRLS 
 PASSWORD '"$postgres_db_useradmin_pw"' LOGIN ;
        END IF;
     END\$\$;
  ALTER ROLE "$postgres_db_useradmin" WITH SUPERUSER CREATEROLE
  CREATEDB REPLICATION BYPASSRLS 
PASSWORD  '"$postgres_db_useradmin_pw"' LOGIN ;
 "

0

TLDR:

Trên nhiều hệ thống, tài khoản của người dùng thường chứa một khoảng thời gian hoặc một loại hàm (người dùng: john.smith, horise.johnson). Ở những trường hợp này, một sửa đổi sẽ phải được thực hiện cho câu trả lời được chấp nhận ở trên. Thay đổi yêu cầu tên người dùng phải được trích dẫn kép.

Example:

ALTER USER "username.lastname" WITH PASSWORD 'password'; 

Hợp lý:

Postgres khá kén chọn khi nào nên sử dụng 'trích dẫn kép' và khi nào nên sử dụng 'trích dẫn đơn'. Thông thường khi cung cấp một chuỗi bạn sẽ sử dụng một trích dẫn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.