PostgreSQL: จะเปลี่ยนรหัสผ่านผู้ใช้ PostgreSQL ได้อย่างไร?


คำตอบ:


1406

สำหรับรหัสผ่านเข้าสู่ระบบน้อย:

sudo -u user_name psql db_name

ในการรีเซ็ตรหัสผ่านหากคุณลืม:

ALTER USER user_name WITH PASSWORD 'new_password';

126
ให้รหัสผ่านที่ชัดเจนในประวัติคำสั่ง postgresql ของผู้ใช้
เกอร์

118
@ รวม: ดังนั้นลบออก:rm ~/.psql_history
RickyA

43
ปิดหัวข้อ แต่หากใครก็ตามที่กำลังมองหา "วิธีการเปลี่ยนชื่อผู้ใช้" มากกว่าทำALTER USER myuser RENAME TO newname;... ด้วยเหตุผลบางอย่าง google ก็ชี้ให้ฉันที่นี่เมื่อฉัน googling ที่ :)
เทียบเท่า

10
ทำไมคุณถึงใช้ทั้ง "และ" อัญประกาศฉันหมายความว่ามีความแตกต่างและในแบบสอบถาม DML คุณต้องใช้ 'เมื่อจัดการกับสตริง แต่มีเหตุผลพิเศษที่จะใช้ทั้งสองที่นี่
Boyan

7
ผู้ใช้เป็นวัตถุไม่ใช่สตริง เปรียบเทียบกับ ALTER TABLE "table_name" หรือแม้แต่ SELECT * FROM "table_name" คุณไม่สามารถใช้เครื่องหมายคำพูดเดี่ยวในบริบทเหล่านี้กับตารางและมันก็เหมือนกับผู้ใช้ / บทบาท
P Daddy

630

จากนั้นพิมพ์:

$ sudo -u postgres psql

แล้ว:

\password postgres

จากนั้นให้ออกpsql:

\q

หากไม่ได้ผลให้กำหนดค่าการพิสูจน์ตัวตนใหม่

แก้ไข/etc/postgresql/9.1/main/pg_hba.conf(เส้นทางจะแตกต่างกัน) และเปลี่ยนแปลง:

    local   all             all                                     peer

ถึง:

    local   all             all                                     md5

จากนั้นรีสตาร์ทเซิร์ฟเวอร์:

$ sudo service postgresql restart

3
รหัสผ่านเริ่มต้นสำหรับ postgres คืออะไร เปลี่ยนมันโดยไม่ตั้งใจ; เป็นไปได้ที่จะรีเซ็ตหรือไม่
Saad

2
(บน psql 9.2) ถ้าฉันพิมพ์เข้าไป\pมันจะให้รหัสผ่านแก่ฉัน ถ้าฉันพิมพ์\password postgresมันจะให้รหัสผ่านและคำเตือนแล้ว\p extra argument "assword" ignored; \p extra argument "postgres" ignored
David LeBauer

1
นี่ดีกว่าการทิ้งรหัสผ่านไว้ในประวัติคำสั่ง SQL
otocan

1
@ZacharyScott คุณพูดอะไร
TheRealChx101

2
ในการเปลี่ยนรหัสผ่านของผู้ใช้ postgres ใน Linux:sudo passwd postgres
Punnerud

88

คุณสามารถและควรมีการเข้ารหัสรหัสผ่านของผู้ใช้:

ALTER USER username WITH ENCRYPTED PASSWORD 'password';

45
คำหลักนี้ไม่สำคัญสำหรับรุ่นปัจจุบัน จาก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
ระวัง! ความคิดเห็น @ John29 เป็นจริงจาก Postgresql 10 ขึ้นไป สำหรับรุ่นอื่น ๆ ธง ENCRYPTED มีความสำคัญ
phep

51

ฉันเชื่อว่าวิธีที่ดีที่สุดในการเปลี่ยนรหัสผ่านคือใช้งานง่าย:

\password

ในคอนโซล Postgres

ที่มา:

ต้องใช้ความระมัดระวังเมื่อระบุรหัสผ่านที่ไม่ได้เข้ารหัสด้วยคำสั่งนี้ รหัสผ่านจะถูกส่งไปยังเซิร์ฟเวอร์ใน cleartext และมันอาจถูกบันทึกไว้ในประวัติคำสั่งของลูกค้าหรือบันทึกเซิร์ฟเวอร์ psql มี command \ password ที่สามารถใช้ในการเปลี่ยนรหัสผ่านของบทบาทโดยไม่ต้องเปิดเผยรหัสผ่าน cleartext

จากhttps://www.postgresql.org/docs/9.0/static/sql-alterrole.html


8
นอกจากนี้ยังสามารถใช้ในการเปลี่ยนรหัสผ่านสำหรับผู้ใช้รายอื่น:\password username
มาร์ติน

34

ในการเปลี่ยนรหัสผ่านโดยใช้บรรทัดคำสั่ง Linux ให้ใช้:

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

5
เพียงจำไว้ว่านี่อาจจะบันทึกรหัสผ่านผู้ใช้ของ db ในประวัติคำสั่งของคุณ
Pedro Cordeiro

2
คุณสามารถใช้ตัวแปรสภาพแวดล้อมที่นี่ได้ไหม ฉันต้องการทำให้เป็นอัตโนมัติในสคริปต์ปรับใช้
TheRealChx101

26

เพื่อเปลี่ยนรหัสผ่าน

 sudo -u postgres psql

แล้วก็

\password postgres

ตอนนี้ป้อนรหัสผ่านใหม่และยืนยัน

จากนั้น\qเพื่อออก


1
คำตอบนี้ช่วยฉัน ขอบคุณ
mohammad jawad Barati

24

ไปที่การตั้งค่า Postgresql และแก้ไข pg_hba.conf

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

จากนั้นเปลี่ยนสายนี้:

Database administrative login by Unix domain socket
local      all              postgres                                md5

ถึง :

Database administrative login by Unix domain socket
local   all             postgres                                peer

จากนั้นเริ่มบริการ PostgreSQL อีกครั้งผ่านคำสั่ง SUDO จากนั้น

psql -U postgres

ตอนนี้คุณจะถูกป้อนและจะเห็นเทอร์มินัล Postgresql

จากนั้นป้อน

\password

และป้อนรหัสผ่านใหม่สำหรับผู้ใช้เริ่มต้น Postgres หลังจากเปลี่ยนรหัสสำเร็จอีกครั้งไปที่ pg_hba.conf และเปลี่ยนการเปลี่ยนแปลงเป็น "md5"

ตอนนี้คุณจะเข้าสู่ระบบในฐานะ

psql -U postgres

ด้วยรหัสผ่านใหม่ของคุณ

แจ้งให้เราทราบหากคุณพบปัญหาใด ๆ ในนั้น


มันใช้งานไม่ได้:user@user-NC10:~$ psql -U postgres psql: FATAL: Peer authentication failed for user "postgres"
จีเอ็ม

ตกลงทำวิธีอื่น sudo su - postgres psql คุณจะเข้าไปที่ terminal แล้วเปลี่ยนรหัสผ่านที่นั่นนี่เป็นอีกทางเลือกหนึ่งสำหรับสิ่งนี้ แจ้งให้เราทราบว่าวิธีนี้เหมาะกับคุณหรือคุณต้องการคำอธิบายแบบเต็ม
Murtaza Kanchwala

mm ฉันลองแล้ว แต่ฉันมีข้อผิดพลาดอื่น: / usr / bin / psql: บรรทัด 19: use: ไม่พบคำสั่ง / usr / bin / psql: บรรทัด 21: use: ไม่พบคำสั่ง / usr / bin / psql: บรรทัด 23: ใช้: ไม่พบคำสั่ง / usr / bin / psql: บรรทัด 24: ใช้: ไม่พบคำสั่ง / usr / bin / psql: psql: บรรทัดที่ 26: ข้อผิดพลาดทางไวยากรณ์ใกล้โทเค็นที่ไม่คาดคิด$version,' /usr/bin/psql: psql: line 26: ของฉัน ($ version, $ cluster, $ db, $ port , โฮสต์ $); ' ขอบคุณสำหรับความช่วยเหลือของคุณ!
จีเอ็ม

11

ในการขอรหัสผ่านใหม่สำหรับผู้ใช้postgres (โดยไม่แสดงในคำสั่ง):

sudo -u postgres psql -c "\password"

9

การกำหนดค่าที่ฉันมีบนเซิร์ฟเวอร์ของฉันได้รับการปรับแต่งเป็นจำนวนมากและฉันสามารถเปลี่ยนรหัสผ่านได้หลังจากตั้งค่าการตรวจสอบความน่าเชื่อถือในpg_hba.confไฟล์แล้ว :

local   all   all   trust

อย่าลืมเปลี่ยนกลับเป็นรหัสผ่านหรือ md5


1
คุณต้องเริ่มบริการ postgres ใหม่เพื่อให้การเปลี่ยนแปลงมีผลsudo systemctl restart postgresql.service
Sampath Surineni

ไฟล์ pg_hba.conf นี้ควรอยู่ที่ไหน
JMStudios.jrichardson

8

นี่เป็นผลลัพธ์แรกบน google เมื่อฉันดูวิธีเปลี่ยนชื่อผู้ใช้ดังนั้น:

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

คำสั่งอื่น ๆ ที่เป็นประโยชน์สำหรับการจัดการผู้ใช้:

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

ย้ายผู้ใช้ไปยังกลุ่มอื่น

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

7

สำหรับกรณีของฉันใน Ubuntu 14.04 ติดตั้งพร้อมกับ postgres 10.3 ฉันต้องทำตามขั้นตอนต่อไปนี้

  • su - postgres เพื่อสลับผู้ใช้เป็น postgres
  • psql เพื่อเข้าสู่เปลือก postgres
  • \password จากนั้นป้อนรหัสผ่านของคุณ
  • \q เพื่อออกจากเซสชันเชลล์
  • จากนั้นคุณสลับกลับไปที่รูทโดยดำเนินการexitและกำหนดค่าpg_hba.conf(ของฉันอยู่ที่/etc/postgresql/10/main/pg_hba.conf) โดยทำให้แน่ใจว่าคุณมีบรรทัดต่อไปนี้

    local all postgres md5

  • เริ่มบริการ postgres ของคุณอีกครั้งโดย service postgresql restart
  • ตอนนี้เปลี่ยนเป็นpostgresผู้ใช้และป้อนเปลือก postgres อีกครั้ง มันจะพร้อมท์ให้คุณใส่รหัสผ่าน

ฉันไม่คิดว่าคุณจะต้องเริ่มบริการ postgresql อีกครั้งหลังจากเปลี่ยนรหัสผ่าน ฉันสามารถรีเซ็ตรหัสผ่านด้วยการรีสตาร์ทได้ \ รหัสผ่านเป็นวิธีที่เร็วที่สุด หรืออื่น ๆ ที่คุณต้องการคำสั่ง ALTER USER
Archit Kapoor

3

ใช้สิ่งนี้:

\password

ป้อนรหัสผ่านใหม่ที่คุณต้องการสำหรับผู้ใช้นั้นแล้วยืนยัน หากคุณจำรหัสผ่านไม่ได้และต้องการเปลี่ยนรหัสผ่านคุณสามารถเข้าสู่ระบบเป็น postgres แล้วใช้สิ่งนี้:

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

3

คล้ายกับคำตอบอื่น ๆ ในไวยากรณ์ แต่ควรทราบว่าคุณสามารถส่งผ่าน md5 ของรหัสผ่านเพื่อที่คุณจะไม่ส่งรหัสผ่านแบบข้อความธรรมดา

ต่อไปนี้เป็นสถานการณ์บางประการที่ไม่ได้ตั้งใจจากการแก้ไขรหัสผ่านผู้ใช้ในข้อความธรรมดา

  1. หากคุณไม่มี SSL และกำลังแก้ไขจากระยะไกลคุณกำลังส่งรหัสผ่านแบบข้อความธรรมดาผ่านเครือข่าย
  2. หากคุณมีการกำหนดค่าการบันทึกของคุณเพื่อบันทึกงบ DDL log_statement = ddlหรือสูงกว่ารหัสผ่านข้อความธรรมดาของคุณจะปรากฏในบันทึกข้อผิดพลาดของคุณ
    1. หากคุณไม่ได้ป้องกันบันทึกเหล่านี้มันเป็นปัญหา
    2. หากคุณรวบรวมบันทึก / ETL เหล่านี้และแสดงในที่ที่คนอื่นสามารถเข้าถึงได้พวกเขาอาจเห็นรหัสผ่านนี้ได้ ฯลฯ
    3. หากคุณอนุญาตให้ผู้ใช้จัดการรหัสผ่านพวกเขาจะเปิดเผยรหัสผ่านโดยไม่รู้ตัวต่อผู้ดูแลระบบหรือพนักงานระดับต่ำที่มอบหมายให้ตรวจสอบบันทึก

ด้วยที่กล่าวไว้ที่นี่เป็นวิธีที่เราสามารถเปลี่ยนรหัสผ่านของผู้ใช้โดยการสร้าง md5 ของรหัสผ่าน

  • โพสต์เมื่อ hash รหัสผ่านเป็น md5, salts รหัสผ่านด้วยชื่อผู้ใช้จากนั้นใส่ข้อความ "md5" ลงในแฮชที่เป็นผลลัพธ์
  • เช่น "md5" + md5 (รหัสผ่าน + ชื่อผู้ใช้)

  • ในทุบตี:

    ~$ echo -n "passwordStringUserName" | md5sum | awk '{print "md5"$1}'
    md5d6a35858d61d85e4a82ab1fb044aba9d
  • ใน 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
  • ในที่สุดALTER USERคำสั่งของเราก็จะเป็นเช่นนั้น
    ALTER USER UserName WITH PASSWORD 'md5d6a35858d61d85e4a82ab1fb044aba9d';
  • ลิงก์ที่เกี่ยวข้อง (หมายเหตุฉันจะเชื่อมโยงไปยังเอกสารเวอร์ชันล่าสุดเพื่อรุ่นเก่าเท่านั้นมันเปลี่ยนแปลงบางอย่าง แต่ md5 ยังคงสนับสนุนวิธีการบางอย่างกลับคืนมา)
  • สร้างบทบาท
  • รหัสผ่านจะถูกจัดเก็บไว้ในแคตตาล็อกระบบเสมอ คำสำคัญ ENCRYPTED ไม่มีผลกระทบ แต่ได้รับการยอมรับสำหรับความเข้ากันได้ย้อนหลัง วิธีการเข้ารหัสนั้นกำหนดโดยพารามิเตอร์การกำหนดค่ารหัสผ่าน หากสตริงรหัสผ่านที่นำเสนอมีอยู่แล้วในรูปแบบที่เข้ารหัส MD5 หรือเข้ารหัส SCRAM ก็จะถูกเก็บไว้เป็น - ไม่คำนึงถึง password_encryption (เนื่องจากระบบไม่สามารถถอดรหัสสตริงรหัสผ่านที่เข้ารหัสที่ระบุเพื่อเข้ารหัสในรูปแบบที่แตกต่างกัน) วิธีนี้ช่วยให้สามารถโหลดรหัสผ่านที่เข้ารหัสระหว่างการถ่ายโอนข้อมูล / คืนค่าได้

  • การตั้งค่าการกำหนดค่าสำหรับรหัสผ่านเข้ารหัส
  • postgres เอกสารรับรองความถูกต้องรหัสผ่าน
  • การสร้างรหัสผ่าน mgr5 postgres

1

โดยทั่วไปเพียงใช้ pg admin UI สำหรับทำกิจกรรมที่เกี่ยวข้องกับฐานข้อมูล

หากคุณมุ่งเน้นไปที่การตั้งค่าฐานข้อมูลอัตโนมัติสำหรับการพัฒนาในท้องถิ่นของคุณหรือ CI เป็นต้น

ตัวอย่างเช่นคุณสามารถใช้คอมโบง่าย ๆ เช่นนี้

(a) สร้างผู้ใช้ dummy super ผ่าน jenkins ด้วยคำสั่งที่คล้ายกับสิ่งนี้:

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

สิ่งนี้จะสร้างผู้ใช้ขั้นสูงที่เรียกว่า experiment001 ในตัวคุณ postgres db

(b) ให้รหัสผ่านแก่ผู้ใช้นี้โดยการรันคำสั่ง NON-Interactive SQL

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

Postgres น่าจะเป็นฐานข้อมูลที่ดีที่สุดสำหรับการทำเครื่องมือบรรทัดคำสั่ง (ไม่โต้ตอบ) การสร้างผู้ใช้รัน SQL ทำการสำรองฐานข้อมูลและอื่น ๆ ... โดยทั่วไปแล้วมันค่อนข้างพื้นฐานกับ postgres และโดยรวมแล้วค่อนข้างเล็กน้อยที่จะรวมสิ่งนี้เข้ากับสคริปต์การตั้งค่าการพัฒนาของคุณหรือในการกำหนดค่า CI อัตโนมัติ


1

และวิธีอัตโนมัติอย่างสมบูรณ์พร้อมกับ bash และคาดหวัง ( ในตัวอย่างนี้เราให้ผู้ดูแลระบบ postgres ใหม่พร้อมกับ postgres ที่จัดเตรียมใหม่ pw ทั้งบน OS และ 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:

ในหลาย ๆ ระบบบัญชีผู้ใช้มักจะมีจุดหรือจุดแยก (ผู้ใช้: john.smith, horise.johnson) ในกรณีเหล่านี้จะต้องทำการแก้ไขคำตอบที่ได้รับการยอมรับข้างต้น การเปลี่ยนแปลงจะต้องมีชื่อผู้ใช้เป็นสองเท่า

Example:

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

มีเหตุผล:

Postgres ค่อนข้างจู้จี้จุกจิกเมื่อใช้ 'double quote' และเมื่อใช้ 'single quote' โดยทั่วไปเมื่อระบุสตริงคุณจะใช้เครื่องหมายคำพูดเดี่ยว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.