การสร้างการเชื่อมต่อ SSL กับฐานข้อมูล PostgreSQL Server

เมื่อพยายามรักษาข้อมูลในฐานข้อมูล PostgreSQL ให้ปลอดภัยสิ่งแรกที่ต้องทำคือเข้ารหัสการเชื่อมต่อทั้งหมดเพื่อปกป้องข้อมูลรับรองการพิสูจน์ตัวตน (ชื่อผู้ใช้ / รหัสผ่าน) คู่มือนี้จัดทำขึ้นเพื่อช่วยในการสร้างการเชื่อมต่อ SSL ที่ปลอดภัยกับคอนเทนเนอร์ PostgreSQL ซึ่งโฮสต์อยู่ที่ Ruk-Com Cloud

ด้านล่างนี้เราจะสำรวจ การปรับแต่ง PostgreSQL Server ที่เหมาะสมซึ่งจำเป็นสำหรับการเปิดใช้ SSL และการสร้างใบรับรอง จากนั้นเราจะสร้างและเพิ่มใบรับรองสำหรับเครื่อง link # client และสุดท้ายจะสร้าง connection ที่ปลอดภัยกับเซิร์ฟเวอร์ของเราผ่านเครื่องมือ pgAdmin ไปดูกันต่อเลย

การกำหนดค่า PostgreSQL Server

เห็นได้ชัดว่าสำหรับบทนี้เราจะใช้ Environment ที่มีฐานข้อมูล PostgreSQL อยู่ภายในซึ่งคุณสามารถ link # create ได้อย่างง่ายดายหากคุณยังไม่ได้ทำมาก่อน

Tip: ในกรณีที่คุณไม่เคยดำเนินการที่คล้ายกันมาก่อนคุณจำเป็นต้องรู้เรืองเหล่านี้

2. ตอนนี้เพื่อให้สามารถทำงานกับ SSL ได้ คุณต้องเพิ่มไฟล์ 3 ไฟล์ต่อไปนี้ในไดเร็กทอรีเซิร์ฟเวอร์ /var/lib/pgsql/data 

  • server.key – ไพรเวทคีย์
  • server.crt – ใบรับรองเซิร์ฟเวอร์
  • root.crt – ใบรับรองหลักที่เชื่อถือได้

เคล็ดลับ :

  • เราจะไม่อธิบายรายละเอียดเกี่ยวกับพารามิเตอร์คำสั่งในที่นี้ แต่หากคุณต้องการทราบข้อมูลเพิ่มเติม เพียงแค่ดูหน้า link # Self-Signed Custom SSL ในเอกสารของเราหรือตรวจสอบเว็บไซต์ official link # OpenSSL เพื่อดูลิสการดำเนินการทั้งหมดที่มีอยู่
  • คุณยังสามารถใช้ใบรับรอง link # custom SSL ได้เช่นเดียวกับที่อธิบายไว้ด้านล่าง (ทำตามส่วนสร้างใบรับรอง Custom SSL ของคำแนะนำที่เชื่อมโยงกันเพื่อรับข้อมูลดังกล่าว) ในกรณีหลังนี้คุณสามารถข้ามขั้นตอนการสร้างและข้ามไปยัง link # 6th step ของคำสั่งนี้ได้โดยตรง

ไปที่โฟลเดอร์ที่กล่าวถึงและดำเนินการตามขั้นตอนด้านล่าง

3. ก่อนอื่นมาทำการสร้างไฟล์แรก – ไพรเวทคีย์:

– ดำเนินการคำสั่งต่อไปนี้:

cd /var/lib/pgsql/data
openssl genrsa -des3 -out server.key 1024

ในระหว่างการสร้าง server.key คุณจะถูกขอ pass phrase – ระบุและยืนยันเพื่อเสร็จสิ้นการสร้าง

– ตอนนี้เพื่อที่จะทำงานกับคีย์นี้ต่อไปจำเป็นต้องลบรหัสผ่านที่คุณได้เพิ่มไว้ก่อนหน้านี้ ให้ดำเนินการคำสั่งต่อไปนี้:

openssl rsa -in server.key -out server.key

ป้อนรหัส passphase อีกครั้ง เพื่อยืนยันอีกครั้ง

– ตั้งค่า การอนุญาต และสิทธิ์การเป็นเจ้าของที่เหมาะสมสำหรับไฟล์ไพรเวทคีย์ของคุณด้วยคำสั่งถัดไป:

chmod 400 server.key
chown postgres.postgres server.key

4. ตอนนี้ต้องสร้างใบรับรองเซิร์ฟเวอร์ตามไฟล์ server.key ของคุณเช่น:

openssl req -new -key server.key -days 3650 -out server.crt -x509 -subj '/C=US/ST=Nontaburi/L=Nontaburi/O=RukCom/CN=mysite.com/[email protected]'

Note: นี่คือข้อมูลที่ต้องใส่สำหรับพารามิเตอร์ –subj ถ้าใบรับรองนี้ ใช้กับ Production:

UnitMeaningExample
/C=CountryGB
/ST=StateLondon
/L=LocationLondon
/O=OrganizationGlobal Security
/OU= (optional)Organizational UnitIT Department
/CN=Common Nameexample.com
/emailAddress=Email[email protected]
ถ้าคุณไม่ใส่พารามิเตอร์ -subj ในคำสั่ง จะเป็นการ inquiry โดยอัตโนมัติ.

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

cp server.crt root.crt

ตอนนี้คุณมีไฟล์ใบรับรองทั้ง 3 ไฟล์ คุณสามารถดำเนินการต่อในการกำหนดค่าฐานข้อมูล PostgreSQL ซึ่งจำเป็นสำหรับการเปิดใช้งานและใช้งาน SSL

6. เปิดไฟล์ pg_hba.conf ซึ่งอยู่ในโฟลเดอร์เดียวกันเพื่อแก้ไขด้วย terminal editor ที่ต้องการ (ตัวอย่างเช่น vim) หรือโดยตรงผ่านแดชบอร์ด

แทนที่เนื้อหาเริ่มต้นด้วยบรรทัดต่อไปนี้:

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
# "local" is for Unix domain socket connections only
local   all         all                               trust
# IPv4 local connections:
host    all         all         127.0.0.1/32          trust
# IPv4 remote connections for authenticated users
hostssl all         webadmin    0.0.0.0/0             md5 clientcert=1

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

7. เพื่อเสร็จสิ้นการกำหนดค่าคุณต้องใช้การเปลี่ยนแปลงเพิ่มเติมกับไฟล์ postgresql.conf ไปที่ส่วน ecurity และ Authentication  (ประมาณบรรทัดที่ 80) และเปิดใช้งานการใช้งาน SSL โดยการนำคอมเมนต์ออกและเปลี่ยนค่าเป็น “on”  นอกจากนี้ให้เพิ่มพารามิเตอร์ ssl_ca_file ใหม่ด้านล่าง:

ssl = on
ssl_ca_file = 'root.crt'

อย่าลืมบันทึกการแก้ไข

8. สุดท้ายรีสตาร์ทคอนเทนเนอร์ PostgreSQL ของคุณเพื่อใช้การตั้งค่าใหม่:

sudo service postgresql restart

Client Certificates

ตอนนี้เรามาสร้างไฟล์ใบรับรอง SSL สำหรับ client instance เพิ่มอีกหนึ่งชุดเพื่อรองรับการเชื่อมต่อที่ปลอดภัยทั้งสองด้าน

1. กลับไปที่หน้าต่างเทอร์มินัลพร้อมการเชื่อมต่อ SSH ไปยังเซิร์ฟเวอร์ PostgreSQL เมื่อเข้าไปข้างในแล้วให้สร้างไพรเวทคีย์สำหรับไคลเอนต์ ตัวอย่างเช่นในไดเร็กทอรี /tmp:

openssl genrsa -des3 -out /tmp/postgresql.key 1024  
openssl rsa -in /tmp/postgresql.key -out /tmp/postgresql.key

2. จากนั้นสร้างใบรับรอง SSL สำหรับผู้ใช้ฐานข้อมูล PostgreSQL (โดยค่าเริ่มต้นเป็น webadmin) และลงนามด้วยไฟล์ root.crt ที่เชื่อถือได้ของเราบนเซิร์ฟเวอร์

openssl genrsa -des3 -out /tmp/postgresql.key 1024
openssl rsa -in /tmp/postgresql.key -out /tmp/postgresql.key

หมายเหตุ :

  • ในขณะที่ข้อมูลทั่วไปสำหรับพารามิเตอร์ subj สามารถเปลี่ยนเป็นข้อมูลส่วนบุคคลของคุณได้ที่นี่ Common Name (/ CN =) ต้องเท่ากับชื่อผู้ใช้ฐานข้อมูลที่คุณตั้งไว้ในระหว่างการสร้างใบรับรองครั้งแรกในไฟล์การกำหนดค่าเซิร์ฟเวอร์ (ในกรณีของเราคือ webadmin)
  • ไฟล์ root.crt และ server.key ควรอยู่ในโฟลเดอร์เดียวกันคำสั่งที่ 2 ที่ถูกเรียกใช้ มิฉะนั้นควรระบุพาธแบบเต็ม

3. หลังจากสร้างไฟล์ – postgresql.key, postgresql.crt, root.crt เสร็จแล้ว ต้องย้ายไฟล์เหล่านี้ไปยังโฟลเดอร์ .postgresql ที่เครื่องไคลเอนต์ของคุณ (คุณสามารถใช้โปรแกรมเสริม FTP หรือเพียงแค่คัดลอกและวางไฟล์เนื้อหาลงไป)

เคล็ดลับ : หากยังไม่มีไดเร็กทอรีดังกล่าวให้สร้างด้วย mkdir ~/.postgresql หรือคำสั่งที่คล้ายกันตามระบบปฏิบัติการของคุณ

SSL certificates for client

นอกจากนี้หากจำเป็นคุณสามารถตั้งค่าสิทธิ์ในการอ่านคีย์สำหรับเจ้าของเท่านั้นด้วยคำสั่ง chmod 0400 ~/.postgresql/postgresql.key เพื่อให้เกิดความปลอดภัยมากขึ้น

เคล็ดลับ : อย่าลืมลบคีย์ออกจากไดเร็กทอรี tmp บนเซิร์ฟเวอร์ฐานข้อมูลของคุณในภายหลัง

สร้างการเชื่อมต่อผ่าน PgAdmin

ในที่สุดหลังจากการกำหนดค่าเซิร์ฟเวอร์และไคลเอ็นต์เสร็จสิ้นคุ ณก็พร้อมที่จะสร้างการเชื่อมต่อ ในกรณีของเราจะใช้เครื่องมือ  pgAdmin 4 เป็นตัวอย่างดังนั้นจึงควรติดตั้งแอปพลิเคชันนี้ (หรือแอปพลิเคชันอื่น ๆ ที่ต้องการ) ไว้ล่วงหน้า

1. ในการเชื่อมต่อกับเซิร์ฟเวอร์ฐานข้อมูลผ่าน SSL คุณต้องเชื่อมต่อ link # public IP หรือ link # endpoint สำหรับคอนเทนเนอร์ฐานข้อมูล PostgreSQL 

เราจะพิจารณากรณีส่วนหลัง – เข้าถึงการตั้งค่า Environment เปลี่ยนไปที่ส่วน Endpoints และ Add จุด endpoint ใหม่ด้วยปุ่มชื่อเดียวกันที่หน้าต่างด้านบน

2. ตอนนี้เมื่อคุณมีจุดเชื่อมต่อแล้วให้เรียกใช้ไคลเอนต์ pgAdmin 4 และเลือก Create Server

3. เลือกที่ tab Connection ป้อนข้อมูล hostname และ port

4. เลือกที่แถบ SSL และ ที่ SSL Mode ให้เลือกเป็น Require เสร็จแล้วใหักด Save

ตอนนี้คุณสามารถเชื่อมต่อแอปพลิเคชันของคุณกับฐานข้อมูลได้แล้ว (ใช้คำแนะนำ เชื่อมต่อกับฐานข้อมูล เป็นตัวอย่าง) และเปิดใช้งานการกำหนดค่า SSL สำหรับโปรเจ็กต์ของคุณเพื่อเข้ารหัสข้อมูลของคุณในขณะที่ดึง / ถ่ายโอนข้อมูล

หากคุณประสบปัญหาใด ๆ ขณะกำหนดค่าการเชื่อมต่อ SSL โปรดอย่าลังเลที่จะขอความช่วยเหลือจากผู้เชี่ยวชาญด้านเทคนิคของเราที่ Stackoverflow