۱. ابتدا پکیج های لازم رو نصب میکنیم:
$ sudo apt install postgresql postgresql-contrib
۲. بعد از نصب پکیج ها، کاربر postgres بصورت پیشفرض بر روی سیستم لینوکسی ایجاد میشود.
همینطور یک کاربر هم برای دیتابیس پستگرس با همین نام (postgres) بصورت پیشفرض ساخته می شود.
شما با این کاربر باید لاگین کنید و تنظیمات و کانفیگ های اولیه بر روی دیتابیس رو بوسیله این کاربر انجام بدید.
برای لاگین کردن به دیتابیس پستگرس، باید به این کاربر در سیستم لینوکس لاگین کنید.
ابتدا برای این کاربر پسورد مناست تنظیم کنید:
$ sudo passwd postgres # first change password for postgres user
سپس به این کاربر سوویچ کنید:
$ su - postgres # switch to postgres user
در نهایت از طریق کلاینت psql به دیتابیس متصل شوید:
$ psql [<database>] # connect with optional database <database>
دو مرحله آخر را میتوان در یک دستور و بدون سوویچ هم به سرانجام رساند:
$ sudo -u postgres psql [<database>]
به همین سادگی!
ولی چرا و چطور؟
پستگرس بصورت پیشفرض اجازه لاگین به کاربر postgres را فقط از طریق کلاینت psql محدود کرده.
این محدودیت در فایل pg_hba.conf در مسیر /etc/postgresql/14/main/pg_hba.conf بدین صورت اعمال شده است:
# TYPE DATABASE USER ADDRESS METHOD
local all all peer
یعنی اینکه تمام اتصالات local یا اتصالات مبتنی بر Unix-domain socket از همه کاربرها به همه دیتابیس ها باید به روش peer احراز هویت شود!
اما اتصال local یا مبتنی بر Unix-domain socket چیه؟ همینطور منظور از احراز هویت peer هم؟
کلاینت psql برای اتصال به دیتابیس از روی خود سرور (یعنی هم سرور و هم کلاینت بر روی یک ماشین یکسان باشند) از سوکت های یونیکس برای اتصال استفاده میکنه.
پس منظور از local در اینجا اتصال محلی از طریق psql هستش.
اما peer چی؟ احراز هویت به روش peer ، کاربر لینوکسی فعلی رو الزام میکند که نام کاربری یکسانی با کاربر دستور psql داشته باشد.
بدین صورت پستگرس برای احراز هویت به سیستم کاربری لینوکس اعتماد کرده و در لحظه ورود بوسیله psql از نام کاربری یکسانی برای اتصال به دیتابیس استفاده میکند.
درنتیجه با این روش هر کاربر در پستگرس باید بر روی سیستم لینوکسی هم یک حساب با همان نام کاربری داشته باشد و به آن لاگین کند و سپس بوسیله psql به دیتابیس متصل شود.
۳. ساخت کاربر جدید در پستگرس:
برای ساخت کاربر جدید ابتدا با کاربر postgres لاگین شوید.
پس ابتدا به کاربر postgres سوویچ میکنیم:
$ su - postgres
سپس با کمک دستور createuser (که در زمان نصب پکیج های دیتابیس همراه با ابزارهای دیگر بر روی سیستم نصب میشود) کاربر جدید به پستگرس اضافه کنید:
$ createuser <user_name>
بازهم میتوان این دو مرحله را با یک دستور و بدون سووچ به سرانجام رساند:
$ sudo -u postgres createuser <user_name>
همینطور پستگرس در لحظه ورود به کاربر خود بصورت پیشفرض کاربر را به دیتابیسی با نام یکسان با نام کاربری متصل میکند پس یک دیتابیس هم با نام یکسان میسازیم:
$ createdb <db_name same as user_name>
یا
$ sudo -u postgres createdb <db_name same as user_name>
بدین صورت ما یک کاربر و یک دیتابیس به همان نام ساختیم.
حال باید به آن متصل شویم.
۴. اتصال به کاربر غیر postgres:
در اینجا اگر روش احراز هویت peer را به خاطر سپرده بوده باشید، به محدودیت این روش روبرو خواهیم شد و برای اتصال به دیتابیس مجبوریم ابتدا یک کاربر لینوکسی به همان نام ساخته و به آن لاگین کنیم
و سپس کلاینت psql را اجرا کنیم تا به دیتابیس احراز هویت شویم.
ولی در عوض ما میخواهیم این محدودیت رو دور بزنیم.
برای لغو این محدودیت باید فایل pg_hba.conf در مسیر /etc/postgresql/14/main/pg_hba.conf بدین صورت تغییر دهیم که اتصالات local را دیگر از طریق سیستم کاربری لینوکس احراز هویت نکند
و به سیستم خودش متکی شود.
بدین منظور بجای روش peer از روش md5 برای هش کردن پسورد و سپس احراز هویت کاربر استفاده میکنیم.
پس تغییرات را بدین شکل اعمال میکنیم:
# TYPE DATABASE USER ADDRESS METHOD
local all all md5
*نکته: روش md5 در اینجا که نوع اتصال local هستش مشکل امنیتی خاصی ایجاد نمیکند ولی برای اتصالات غیر local بهتر است از روش scram-sha-256 استفاده شود.
سپس سرویس دیتابیس را ریاستارت میکنیم تا تغییرات جدید اعمال شود.
برای من که از systemd برای مدیریت سرویس ها استفاده میکنیم بدین شکل هستش:
$ sudo systemctl restart postgresql.service
همچنین چونکه در این روش پستگرس برای احراز هویت دیگر متکی بر سیستم کاربری لینوکس نیستش پس باید برای کاربر پستگرسمان یک پسورد مناسب ایجاد کنیم.
بدین منظور ابتدا بایستی به کاربر postgres لاگین کرده و برای دیگر کاربرها رمز مناسب را تنظیم کنیم:
$ sudo -u postgres psql
$ ALTER USER <postgres_user> WITH PASSWORD '<postgres_user_password>';
*نکته: بنظر باید رشته پسورد حتما بین سینگل کووتیشن (') قرار بگیرد وگرنه با خطا مواجه خواهید شد.
سپس از کاربر postgres خارج شده و بوسیله کلاینت psql به کاربرمان که این بار دارای پسورد هستش و با کمک روش md5 متصل میشویم:
$ \q # exit client
$ psql -U <postgresql_user_name>
و با وارد کردن پسورد به دیتابیس متصل میشویم.
همچین باز هم میتوان با یک دستور پسورد کاربر موردنظر را تغییر داد:
sudo -u postgres psql -c " ALTER USER <user_name> WITH PASSWORD '<password>' ; "
بروزرسانی:
در فایل کانفیگ pg_hba.conf سیستم من این سطر قید شده:
# TYPE DATABASE USER ADDRESS METHOD
host all all 127.0.0.1/32 scram-sha-256
بدین معنی که اتصال tcp/ip از آدرس 127.0.0.1/32 یا localhost از تمام کاربران به تمام دیتابیس ها باید به روش scram-sha-256 احراز هویت شود درنتیجه میتوان با دستور زیر و بدون نیاز به احراز هویت وابسته به سیستم لینوکس و یا تغییر دیگری به دیتابیس وصل شد:
psql --host=localhost --dbname=<database_name> --username=<user_name>