PostgreSQL: Bagaimana cara mengubah kata sandi pengguna PostgreSQL?

996

Bagaimana cara mengubah kata sandi untuk pengguna PostgreSQL?

Saad
sumber

Jawaban:

1406

Untuk kata sandi login lebih sedikit:

sudo -u user_name psql db_name

Untuk mengatur ulang kata sandi jika Anda lupa:

ALTER USER user_name WITH PASSWORD 'new_password';
solaimuruganv
sumber
126
Ini membiarkan kata sandi yang jelas dalam riwayat perintah postgresql pengguna.
greg
118
@reg: jadi hapus:rm ~/.psql_history
RickyA
43
di luar topik tetapi jika ada yang mencari "bagaimana mengubah nama pengguna" daripada melakukan ALTER USER myuser RENAME TO newname;... untuk beberapa alasan google menunjuk saya di sini ketika saya googling itu :)
equivalent8
10
Mengapa Anda menggunakan keduanya "dan 'tanda kutip? Maksudku, ada perbedaan, dan dalam kueri DML Anda harus menggunakan' ketika berhadapan dengan string, tetapi apakah ada alasan khusus untuk menggunakan keduanya di sini?
Boyan
7
Pengguna adalah objek, bukan string. Bandingkan dengan ALTER TABLE "table_name" atau bahkan SELECT * FROM "table_name". Anda tidak dapat menggunakan tanda kutip tunggal dalam konteks ini dengan tabel, dan itu sama dengan pengguna / peran.
P Ayah
630

Kemudian ketik:

$ sudo -u postgres psql

Kemudian:

\password postgres

Lalu untuk berhenti psql:

\q

Jika itu tidak berhasil, konfigurasikan ulang otentikasi.

Edit /etc/postgresql/9.1/main/pg_hba.conf(jalur akan berbeda) dan ubah:

    local   all             all                                     peer

untuk:

    local   all             all                                     md5

Kemudian restart server:

$ sudo service postgresql restart
Bug Clint
sumber
3
apa kata sandi default untuk postgres? mengubahnya secara tidak sengaja; mungkin diatur ulang?
Saad
2
(pada psql 9.2) jika saya mengetik \p, itu memberi saya kata sandi; jika saya mengetiknya \password postgresberikan kata sandi dan kemudian peringatan\p extra argument "assword" ignored; \p extra argument "postgres" ignored
David LeBauer
1
Ini jauh lebih baik daripada meninggalkan kata sandi dalam sejarah perintah SQL.
otocan
1
@ ZacharyScott Apa yang Anda katakan?
TheRealChx101
2
Untuk mengubah kata sandi pada pengguna postgres di Linux:sudo passwd postgres
Punnerud
88

Anda dapat dan harus membuat kata sandi pengguna dienkripsi:

ALTER USER username WITH ENCRYPTED PASSWORD 'password';
yglodt
sumber
45
Kata kunci ini tidak masalah untuk versi saat ini. Dari postgresql.org/docs/current/static/sql-createrole.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
Waspadalah! Komentar John29 hanya benar dari Postgresql 10 ke atas. Untuk semua versi lain, flag ENCRYPTED penting.
phep
51

Saya percaya cara terbaik untuk mengubah kata sandi adalah dengan menggunakan:

\password

di konsol Postgres.

Sumber:

Perhatian harus dilakukan ketika menentukan kata sandi yang tidak terenkripsi dengan perintah ini. Kata sandi akan ditransmisikan ke server dalam cleartext, dan mungkin juga dicatat dalam sejarah perintah klien atau log server. psql berisi perintah \ kata sandi yang dapat digunakan untuk mengubah kata sandi peran tanpa mengekspos kata sandi teks-bersih.

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

Viktor Nordling
sumber
8
Ini juga dapat digunakan untuk mengubah kata sandi untuk pengguna lain:\password username
Martin
34

Untuk mengubah kata sandi menggunakan baris perintah Linux, gunakan:

sudo -u <user_name> psql -c "ALTER USER <user_name> PASSWORD '<new_password>';"
Vajira Lasantha
sumber
5
Ingatlah bahwa ini mungkin akan menyimpan kata sandi pengguna db di riwayat perintah Anda.
Pedro Cordeiro
2
dapatkah Anda menggunakan variabel lingkungan di sini? Saya ingin mengotomatiskan ini dalam skrip deploy
TheRealChx101
26

Untuk Mengubah Kata Sandi

 sudo -u postgres psql

kemudian

\password postgres

sekarang masukkan Kata Sandi Baru dan Konfirmasikan

lalu \qkeluar

Akitha_MJ
sumber
1
jawaban ini membantu saya. terima kasih
mohammad jawad Barati
24

Buka Postgresql Config Anda dan Edit pg_hba.conf

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

Kemudian Ubah Baris ini:

Database administrative login by Unix domain socket
local      all              postgres                                md5

untuk:

Database administrative login by Unix domain socket
local   all             postgres                                peer

kemudian Restart layanan PostgreSQL melalui perintah SUDO

psql -U postgres

Anda sekarang akan dimasukkan dan akan melihat terminal Postgresql

lalu masuk

\password

dan masukkan Kata Sandi BARU untuk pengguna default Postgres, Setelah Berhasil mengubah Kata Sandi lagi pergi ke pg_hba.conf dan kembalikan perubahan ke "md5"

sekarang Anda akan masuk sebagai

psql -U postgres

dengan kata sandi baru Anda.

Beri tahu saya jika Anda semua menemukan masalah di dalamnya.

Murtaza Kanchwala
sumber
Tidak berfungsi:user@user-NC10:~$ psql -U postgres psql: FATAL: Peer authentication failed for user "postgres"
GM
Ok, Lakukan metode lain sudo su - postgres psql Anda akan memasuki terminal dan kemudian mengubah kata sandi di sana, Ini adalah cara alternatif untuk ini. Beritahu saya jika ini cocok untuk Anda atau Anda perlu penjelasan lengkap
Murtaza Kanchwala
mm saya telah mencoba tetapi saya memiliki kesalahan lain: / usr / bin / psql: line 19: use: command not found / usr / bin / psql: line 21: use: command not found / usr / bin / psql: line 23: gunakan: perintah tidak ditemukan / usr / bin / psql: baris 24: gunakan: perintah tidak ditemukan / usr / bin / psql: psql: baris 26: kesalahan sintaksis dekat token tak terduga $version,' /usr/bin/psql: psql: line 26: my ($ version, $ cluster, $ db, $ port , $ host); ' terima kasih atas bantuan Anda!
GM
11

Untuk meminta kata sandi baru untuk pengguna postgres (tanpa menunjukkannya dalam perintah):

sudo -u postgres psql -c "\password"
lcnicolau
sumber
9

Konfigurasi yang saya dapatkan di server saya telah disesuaikan banyak dan saya berhasil mengubah kata sandi hanya setelah saya menetapkan otentikasi trust dalam pg_hba.conffile :

local   all   all   trust

Jangan lupa untuk mengubah ini kembali ke kata sandi atau md5

ruruskyi
sumber
1
Anda juga perlu memulai kembali layanan postgres Anda agar perubahan diterapkansudo systemctl restart postgresql.service
Sampath Surineni
kemana seharusnya file pg_hba.conf ini pergi?
JMStudios.jrichardson
8

Ini adalah hasil pertama di google, ketika saya mencari cara mengubah nama pengguna, jadi:

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

Beberapa perintah lain yang membantu manajemen pengguna:

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

Pindahkan pengguna ke grup lain

ALTER GROUP <old_group> DROP USER <username>;
ALTER GROUP <new_group> ADD USER <username>;
Salvador Dali
sumber
7

Untuk kasus saya di Ubuntu 14,04 diinstal dengan postgres 10.3. Saya perlu mengikuti langkah-langkah berikut

  • su - postgres untuk mengalihkan pengguna ke postgres
  • psql untuk masuk ke shell postgres
  • \password lalu masukkan kata sandi Anda
  • \q untuk keluar dari sesi shell
  • Kemudian Anda beralih kembali ke root dengan mengeksekusi exitdan mengkonfigurasi pg_hba.conf(milik saya /etc/postgresql/10/main/pg_hba.conf) dengan memastikan Anda memiliki baris berikut

    local all postgres md5

  • Mulai ulang layanan postgres Anda dengan service postgresql restart
  • Sekarang beralih ke postgrespengguna dan masukkan shell postgres lagi. Ini akan meminta Anda dengan kata sandi.
haxpor
sumber
Saya rasa Anda tidak perlu me-restart layanan postgresql setelah mengubah kata sandi. Saya sudah bisa mengatur ulang kata sandi dengan menyalakannya kembali. \ kata sandi adalah cara tercepat. Atau Anda membutuhkan perintah ALTER USER.
Archit Kapoor
3

Gunakan ini:

\password

masukkan kata sandi baru yang Anda inginkan untuk pengguna itu dan kemudian konfirmasikan. Jika Anda tidak mengingat kata sandi dan ingin mengubahnya, Anda dapat masuk sebagai postgres dan kemudian gunakan ini:

ALTER USER 'the username' WITH PASSWORD 'the new password';
Chris Dare
sumber
3

Mirip dengan jawaban lain dalam sintaks tetapi harus diketahui bahwa Anda juga dapat melewati md5 kata sandi sehingga Anda tidak mengirimkan kata sandi teks biasa.

Berikut adalah beberapa skenario konsekuensi yang tidak diinginkan dari mengubah kata sandi pengguna dalam teks biasa.

  1. Jika Anda tidak memiliki SSL dan memodifikasi dari jarak jauh, Anda mengirim kata sandi teks biasa ke seluruh jaringan.
  2. Jika Anda telah mengatur konfigurasi logging untuk mencatat Pernyataan DDL log_statement = ddl atau lebih tinggi, kata sandi teks biasa Anda akan muncul di log kesalahan Anda.
    1. Jika Anda tidak melindungi log ini, ini masalah.
    2. Jika Anda mengumpulkan log / ETL ini dan menampilkannya di mana orang lain memiliki akses, mereka akhirnya dapat melihat kata sandi ini, dll.
    3. Jika Anda mengizinkan pengguna untuk mengelola kata sandi mereka, mereka tanpa sadar mengungkapkan kata sandi kepada admin atau karyawan tingkat rendah yang ditugasi meninjau log.

Yang mengatakan di sini adalah bagaimana kita dapat mengubah kata sandi pengguna dengan membangun md5 kata sandi.

  • Postgres ketika hash kata sandi sebagai md5, salin kata sandi dengan nama pengguna kemudian tambahkan teks "md5" ke hash yang dihasilkan.
  • mis: "md5" + md5 (kata sandi + nama pengguna)

  • Dalam bash:

    ~$ echo -n "passwordStringUserName" | md5sum | awk '{print "md5"$1}'
    md5d6a35858d61d85e4a82ab1fb044aba9d
  • Di 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
  • Jadi akhirnya ALTER USERperintah kita akan terlihat seperti
    ALTER USER UserName WITH PASSWORD 'md5d6a35858d61d85e4a82ab1fb044aba9d';
  • Tautan yang Relevan (Catatan Saya hanya akan menautkan ke versi terbaru dokumen untuk yang lebih lama, tetapi beberapa perubahan akan tetapi md5 masih mendukung cara yang kembali.)
  • buat peran
  • Kata sandi selalu disimpan terenkripsi dalam katalog sistem. Kata kunci ENCRYPTED tidak berpengaruh, tetapi diterima untuk kompatibilitas mundur. Metode enkripsi ditentukan oleh parameter konfigurasi password_encryption. Jika string kata sandi yang disajikan sudah dalam format terenkripsi MD5 atau dienkripsi SCRAM, maka itu disimpan apa adanya terlepas dari kata sandi_kripsinya (karena sistem tidak dapat mendekripsi string kata sandi terenkripsi yang ditentukan, untuk mengenkripsi dalam format yang berbeda). Ini memungkinkan pemuatan ulang kata sandi terenkripsi selama dump / restore.

  • pengaturan konfigurasi untuk password_encryption
  • dokumen otentikasi kata sandi postgres
  • membangun kata sandi postgres md5
jkdba
sumber
1

Secara umum, cukup gunakan pg admin UI untuk melakukan aktivitas terkait db.

Jika sebaliknya Anda lebih fokus dalam mengotomatisasi pengaturan basis data untuk pengembangan lokal Anda, atau CI dll ...

Misalnya, Anda dapat menggunakan kombo sederhana seperti ini.

(a) Buat pengguna super dummy melalui jenkins dengan perintah yang mirip dengan ini:

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

ini akan membuat super user bernama experiment001 di postgres db Anda.

(B) Berikan pengguna ini beberapa kata sandi dengan menjalankan perintah SQL NON-Interaktif.

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

Postgres mungkin adalah database terbaik di luar sana untuk tooling baris perintah (non-interaktif). Membuat pengguna, menjalankan SQL, membuat cadangan database dll ... Secara umum semuanya cukup mendasar dengan postgres dan secara keseluruhan cukup sepele untuk mengintegrasikan ini ke dalam skrip pengaturan pengembangan Anda atau ke dalam konfigurasi CI otomatis.

99Sono
sumber
1

dan cara yang sepenuhnya otomatis dengan bash dan expect ( dalam contoh ini kami menyediakan admin postgres baru dengan postgres yang baru disediakan baik pada OS dan level run-time 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 ;
 "
Yordan Georgiev
sumber
0

TLDR:

Pada banyak sistem, akun pengguna sering berisi titik, atau semacam punction (pengguna: john.smith, horise.johnson). Dalam hal ini, modifikasi harus dilakukan terhadap jawaban yang diterima di atas. Perubahan ini mengharuskan nama pengguna dikutip dua kali lipat.

Example:

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

Rasional:

Postgres cukup pilih-pilih kapan harus menggunakan 'penawaran ganda' dan kapan harus menggunakan 'penawaran tunggal'. Biasanya saat memberikan string, Anda akan menggunakan kutipan tunggal.

FlyingV
sumber