Friday, November 22, 2024

file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages

  • โปรเจคเราใช้ codeignitor 4 ตอนพัฒนาใช้ domain name อันหนึ่ง พอตอนจะใช้จริง ลองเปลี่ยนไปใช้อีก domain name แต่เป็น https ทั้ง 2 ชื่อ

$data = file_get_contents($path_url);

  • แต่ได้เจอ error ของ file_get_contents หว่า คล้ายๆ ว่า key การติดต่อกัน ผิดพลาดเพราะเปลี่ยนชื่อ domain

file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:

error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed

Solved

$arrContextOptions=array(

               "ssl"=>array(

                "verify_peer"=>false,

                "verify_peer_name"=>false,

            ),

        );  

        

  $data = file_get_contents($path_url, false, stream_context_create($arrContextOptions));

Ref

  • https://stackoverflow.com/questions/26148701/file-get-contents-ssl-operation-failed-with-code-1-failed-to-enable-crypto


ประสบการเรื่อง Regular Expression ของ Javascript

  • ก่อนหน้านี้เคยพบในคลิปโปรแกรมมิ่งเรื่อง regular expression กรณี input เยอะทำให้ cpu peak แต่ไม่เคยเจอกับตัว
  • แต่ช่วงนี้เจอปัญหา ประเด็นคือ ค้นหาในเน็ต แล้วเอามาใช้เลย ไม่รู้เรื่องว่า โค้ดทำงานอย่างไร (เอาโค้ดมาจาก chat GPT แล้วพบปัญหาและให้ chat optimize โค้ดใหม่)
  • เขียน function ตรวจสอบ string ว่า เป็น URL หรือไม่ใน javascript

function isURL(str) {

var pattern = new RegExp('^((ft|htt)ps?:\\/\\/)?'+ // protocol

            '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name and extension

            '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address

            '(\\:\\d+)?'+ // port

            '(\\/[-a-z\\d%@_.~+&:]*)*'+ // path

            '(\\?[;&a-z\\d%@_.,~+&:=-]*)?'+ // query string

            '(\\#[-a-z\\d_]*)?$','i'); // fragment locator

            return pattern.test(str);

}

  • พอเรียกใช้ฟังก์ชั่นนี้บน android หรือ PC tab ของ browser Google Chrome  กรณี input ไม่เยอะประมาณ 5-10 อักษร ก็ยังใช้งานได้ปกติ 
  • แต่พอ input เยอะๆ ประมาณ 50 ตัวอักษรขึ้นไปล่ะทีนี้เห็นผลเลยคือ อุปกรณ์ android , pc (windows, ubuntu) ค้างเลย ลอง browser ค่ายอื่นๆ ก็ค้าง ไม่รอดหมด
  • แต่ iOS หรือ MacOS หรือ iPadOS มันทำงานได้ปกตินี่สิ ไม่ว่าจะ input เยอะหรือน้อยทำงานได้ปกติเลย ทำให้พบว่า สเปค CPU มันทำงานต่างกันอยู่นะ สมราคาเค้าล่ะ

Solved

  • บอกปัญหาใน chat และให้ chat แก้ไข  

function isURL(str) {

    // Limit string size to avoid processing excessively large inputs

    if (str.length > 2048) return false;


    // Simplified pattern to check URLs

    const pattern = /^(https?:\/\/)?([a-z\d-]+\.)+[a-z]{2,}(\/\S*)?$/i;

    return pattern.test(str);

}

Tuesday, November 12, 2024

เพิ่ม container docker เข้าไปใน group container ที่ทำไว้แล้ว

  • สร้าง image ที่เราได้ทำการ build ใหม่ ไว้ที่ local โดย

$ docker commit <container_id | container_name> myimage_name:v1.0

$ docker commit mycontainer_mysql myimage_mysql:v1.0

  • ตรวจสอบ network container ปัจจุบันที่ใช้งานอยู่

$ docker inspect <container_id | container_name>

$ docker inspect mycontainer_mysql

  • สร้างใช้งาน และเพิ่ม container ใหม่เข้าไปใน network docker ที่มีอยู่
$ docker run --name mycontainer-mysql --network mylamp-network -e MYSQL_ROOT_PASSWORD=password1234 -p 3333:3306 -v /home/user/mydocker/site/mysql_data:/var/lib/mysql -d mysql-myimage:v1.0

เพิ่มเติม

  • ในตัวอย่าง สร้าง image และ เพิ่ม container ใหม่ จาก image ที่เรา build คอนฟิกไว้แล้ว
  • พบว่า database ตัวใหม่ที่ได้เพิ่มเข้าไป มันไม่ไปด้วยเมื่อเราสั่ง commit นะคับ เท่านี้แหละ
  • ส่วน mysql_data ที่ map ไว้มันยังอยู่ปกติไม่หายไปใหน

Ref

  • https://juuier.blogspot.com/2024/09/wordpress-site-sub-https-domain-name.html
  • https://docs.docker.com/reference/cli/docker/container/commit/

Sunday, November 3, 2024

Firebase cloud messaging set web push notify to Google Chrome & Safari

ใช้ firebase เป็น service ในการส่งเข้า web notify สำหรับ เครื่อง android

  • https://www.youtube.com/watch?v=ulYnmSbgeq8
  • https://www.youtube.com/watch?v=iz5arafmatc
  • https://www.youtube.com/watch?v=5gls_e1JyeY
สำหรับ IOS IPadOS
  • https://www.youtube.com/watch?v=G6n4FxuhiJo
  • https://firebase.blog/posts/2023/08/fcm-for-safari/
  • https://stackoverflow.com/questions/76493356/notification-requestpermission-not-prompting-allow-deny-on-ios-safari-16-5
  • https://www.xda-developers.com/how-enable-safari-notifications-iphone/
เพิ่มเติม
  • IOS สำคัญต้องมี manifesh.json => { "display": "standalone"  } หรือ { "display": "fullscreen" }
<link rel="manifest" href="https://mysite/path/manifest.json">
  • สำหรับตั้งค่า icon เมื่อเพิ่มเข้าหน้า home screen
<link rel="apple-touch-icon" href="https://mysite/path/images/logo_bg_white.png">
  • IOS หรือ IpadOS  ต้อง 16.4+ และ Safari 16.1+
  • อ้างอิง บน IPadOS 18.1, IOS 18.1
  • ตั้งค่าให้ safari Enable notification โดย Setting => Apps => Safari => Advanced => Feature Flags => Notifications
  • จากนั้น เปิด Safari เข้าไป site แล้ว share แบบ Add to Home Screen (เครื่องหมายชี้ขึ้น ข้างๆ เครื่องหมายบวกเพิ่ม tab) ถ้าไม่เพิ่ม to home screen จะ request permission ไม่ผ่าน denie ตลอด
  • โค้ดฝั่ง server ต้องสร้าง ปุ่มสำหรับ request permission (ลอง settimeout หรือ trigger click permission denied ทั้งหมด ต้องกดปุ่มเองเท่านั้นจริงจะ granted)

Friday, October 11, 2024

Set enforce complex password Ubunut 22.04

1) Install the libpam-pwquality package
sudo apt update
sudo apt install libpam-pwquality
2) Edit the PAM password configuration file  open the /etc/pam.d/common-password file for editing:
sudo nano /etc/pam.d/common-password
3) Add or modify the pwquality settings:
password requisite pam_pwquality.so retry=3
password requisite pam_pwquality.so retry=3 minlen=12 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1
retry=3: Allows 3 retries if the user enters an invalid password.
minlen=12: Requires a minimum password length of 12 characters.
dcredit=-1: Requires at least 1 digit.
ucredit=-1: Requires at least 1 uppercase letter.
lcredit=-1: Requires at least 1 lowercase letter.
ocredit=-1: Requires at least 1 special character (e.g., @, #, $).
4) Optional: Add additional password strength rules:
sudo nano /etc/security/pwquality.conf
Here you can add options like:
minlen = 12
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
maxrepeat = 2       # Prevent repeated characters
maxclassrepeat = 2  # Prevent excessive character class repetition
5) Save and exit: After editing
6) Test the configuration: 
sudo passwd <username>
Ref
  • https://chatgpt.com/share/6708c50a-d480-8010-8ea4-418483178302

Set policy password expire and warning Ubuntu 22.04

Check current password expiration settings
sudo chage -l <username>
Force password change on next login
sudo chage -d 0 <username>
Set a password expiration policy
sudo chage -M 90 <username>
(Optional) Set password warning period
sudo chage -W 7 <username>
Verify changes
sudo chage -l <username>

Ref
  • https://chatgpt.com/share/6708c50a-d480-8010-8ea4-418483178302

Wednesday, October 9, 2024

Use docker container run Slim Framework 4 on Ubuntu 18.04

  • ประเด็นคือ ย้าย Slim Framework 4++ จากเครื่อง มาอีกเครื่องซึ่ง  php มันเป็น 7.0 ทำให้ api ใช้งานไม่ได้เพราะเค้าต้องการ 7.4

Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 7.4.0".

  • แต่เราจะไม่ไปยุ่งกับ Environment เครื่องหลัก เราแก้ปัญหาโดยติดตั้ง docker และใช้งาน container แทน

Step

  • ที่เครื่องปลายทางที่ต้องการจะย้ายไป ให้ ssh เข้าไปตั้งค่าได้เลย
  • ติดตั้ง docker-ce ให้เรียบร้อย และเช็คสถานะ systemctl status docker
  • จากนั้นเราไปสร้าง Dockerfile ใน user เรา

$ cd /home/myuser & mkdir mydocker

$ cd mydocker

  • คัดลอกโปรเจค slim framework ลงมา

$ scp -r user@server:/path/myslim ./

  • เราจะได้ folder ชื่อ myslim ที่ client แล้ว
  • สร้าง Docker file

$ nano Dockerfile

# Use the official PHP 7.4 with Apache base image

FROM php:7.4-apache


# Enable Apache mod_rewrite

RUN a2enmod rewrite


# Install GD extension and MySQL extension

RUN apt-get update && apt-get install -y \

    libfreetype6-dev \

    libjpeg62-turbo-dev \

    libpng-dev \

    libzip-dev \

    && docker-php-ext-configure gd --with-freetype --with-jpeg \

    && docker-php-ext-install gd \

    && docker-php-ext-install mysqli pdo pdo_mysql zip


# Set up Apache configuration (optional: can adjust according to your needs)

RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf


# Restart Apache to ensure the modules and settings are applied

CMD ["apache2-foreground"]

  • build image ใหม่จากต้นฉบับให้เป็นแบบคอนฟิกตามเราก่อนรัน และตั้งชื่อใหม่ จาก Dockerfile ที่เราได้ตั้งค่าต่างๆ ไว้ด้วยคำสั่ง

$ docker build -t php74-apache .

  • ได้ image ของเราแล้วที่คอนฟิกพร้อม ตามต้องการของเรา จากนั้น สร้าง และ รัน container จาก image ของเรา
  • กรณีรันโดยไม่ map web root folder ใน container
$ docker run -d -p 8080:80 --name my_php74_container php74-apache
  • ทดสอบสร้างไฟล์ info.php ใน container
$ docker exec -it my_php74_container bash
root@1fxxxx:/var/www/html# echo "<?php phpinfo(); ?>" >> info.php
root@1fxxxx:/var/www/html# exit
  • กรณีเราจะ map volumen กับ  /home/myuser/mydocker/myslim ที่เครื่อง host
$ docker run -d -p 8080:80 --name my_php74_container \
-v /home/myuser/mydocker/myslim:/var/www/html php74-apache
  •     ทดสอบใช้งานโดย http://localhost:8080/endpoint
เพิ่มเติม
  • กรณีนี้ เราทำ api เป็น sub folder แต่ย้ายมาแล้วเราเอาวางไว้ root web container เลยให้ทำการแล้วไขไฟล์ /home/myuser/mydocker/myslim
$ nano /home/myuser/mydocker/myslim/index.php
  • ปิดการใช้แบบ subfolder ให้ comment ไว้เลย
/** set path for app subdirectory */
// $app->setBasePath('/mysubapp');
Ref

  • https://chatgpt.com/share/6705face-c598-8010-b864-51a1763d4042

Friday, September 20, 2024

How to completely remove a Linux distro from WSL

List

> wsl -l -v

Unregister

> wsl --unregister Debian

Ref

  • https://www.windowscentral.com/how-completely-remove-linux-distro-wsl

Thursday, September 19, 2024

Split & Zip file by zip linux command

From ChatGPT

  • Split 

```bash

$ zip -s 100m -r archive.zip largefile

```

  • Recombine

```bash

$ zip -s 0 archive.zip --out combined.zip

```

Enable bash history timestamp Linux

From ChatGPT

1. **Open or create the `.bashrc` file** in your home directory:

   ```bash

   $ nano ~/.bashrc

   ```

2. **Add the following lines** at the end of the file to enable timestamps in `bash_history`:

   ```bash

   # Enable timestamps in bash history

   HISTTIMEFORMAT="%F %T "

   ```

   - `%F` will add the date in `YYYY-MM-DD` format.

   - `%T` will add the time in `HH:MM:SS` format.

3. **Save and exit** the file (`Ctrl+O` to save, `Enter`, and then `Ctrl+X` to exit).

4. **Apply the changes** by running the following command to reload your `.bashrc`:

   ```bash

 $  source ~/.bashrc

   ```

Now, every command in your Bash history will be prefixed with the timestamp. To view the history with timestamps, simply run:

```bash

$ history

```

Add

  • แยกทำแต่ละ  user

Wednesday, September 18, 2024

ย้าย wordpress site sub ด้านหลัง https domain name เข้ามาใน container >> https://www.site.com/th/

  • หัดทำ wordpress ใน docker container
  • โดยไม่ใช้ image ของ wordpress
  • แต่ใช้ php7.4+apache และ mysql image ใช้ 2 container
  • คือจะเอา wordpress site ซึ่ง อยู่ใน physical server พาธจริง LAMP (PHP7.4) Ubuntu ย้ายเข้าไปใน container
  • โดยจะใช้ apache reverse proxy https domain จริง เข้ามาใน localhost:port ที่กำหนดใน container 
  • เพื่อลดความเสื่ยงและจำกัดความเสียหายให้น้อยที่สุด ต่อภาพรวม เมื่อโดนเล่นงาน

Env

  • Ubuntu 18.04
  • Host จริง enable mod_rewrite

Step

  • ติดตั้ง docker ให้เรียบร้อย
  • คอนฟิก apache host https จริง ให้ /etc/apache2/sites-available/www.site.com-le-ssl.conf

<IfModule mod_ssl.c>

<VirtualHost *:443>

ServerAdmin admin@site.com

ServerName www.site.com

...

ProxyPreserveHost on

ProxyPass / http://localhost:8080/

ProxyReverse / http://localhost:8080/

RequestHeader set X-Forwarded-Proto "https"


Include /etc/.../ssl-apache.conf

SSLCertificateFile...

SSLCertificateKeyFile...

...

</VirtualHost>

</IfModule>

  • คอนฟิก apache host http จริง ให้ /etc/apache2/sites-available/www.site.com.conf

<VirtualHost *:80>

ServerAdmin admin@site.com

ServerName www.site.com

...

ProxyPreserveHost on

ProxyPass / http://localhost:8080/

ProxyReverse / http://localhost:8080/

RequestHeader set X-Forwarded-Proto "https"

</VirtualHost>

  • จากนั้น enable site ทั้ง 2

$ sudo a2ensite www.site.com.conf

$ sudo a2ensite www.site.com.le-ssl.conf

$ systemctl restart apache2

  • ที่นี้มาสร้าง container กัน

$ mkdir -p /home/myuser/public_html/mysql_data

$ mkdir -p /home/myuser/public_htmlapp

$ cd app

  •  ให้เราเอา wordpress site folder มาวางใน app ได้เลย

$ cp -rf th /home/myuser/public_html/app/th

$ cd /home/myuser/public_html

 

          $ nano php.ini

; Set the maximum upload file size

upload_max_filesize = 64M

; Set the maximum POST size

post_max_size = 64M

          memory_limit = 512M          

 

$ nano Dockerfile

# load image php:<version>-apache

FROM php:7.4-apache

# Install PHP extensions

RUN docker-php-ext-install pdo pdo_mysql mysqli

# Use the official PHP-Apache image from Docker Hub

#FROM php:8.1-apache

# Install dependencies if needed

#RUN apt-get update && apt-get install -y \

#    libpng-dev \

#    libjpeg-dev \

#    libfreetype6-dev \

#    && docker-php-ext-configure gd --with-freetype --with-jpeg \

#    && docker-php-ext-install gd

  • สร้างไฟล์ docker-compose.yml

$ cd /home/myuser/public_html

$ nano docker-compose.yml

version: '3.3'

services:

  apache:

    build: .

    # image: webdevops/php-apache:8.2

    container_name: apache

    ports:

      - "8080:80"

              command: bash -c "a2enmod rewrite && apache2-foreground"

              restart: always 

    volumes:

      - ./app:/var/www/html

                - ./php.ini:/usr/local/etc/php/php.ini

    # depends_on:

    #   - mysql

    networks:

      - lamp-network


  mysql:

    image: mysql:latest

    container_name: mysql

    environment:

      MYSQL_ROOT_PASSWORD: rootpassword

      MYSQL_DATABASE: wordpress_site

      MYSQL_USER: wordpress

      MYSQL_PASSWORD: wordpresspassword

    #ports:

    #  - "3306:3306"

    volumes:

      - ./mysql_data:/var/lib/mysql

    networks:

      - lamp-network


 ## optional สำหรับเพิ่มตัวจัดการ database

 phpmyadmin:

    image: phpmyadmin/phpmyadmin:latest

    container_name: phpmyadmin

    environment:

      PMA_HOST: db

      MYSQL_ROOT_PASSWORD: rootpassword

    ports:

      - "8081:80"

    # depends_on:

    #   - mysql

    networks:

      - lamp-network


networks:

  lamp-network:

    driver: bridge


  • จากนั้นสั่ง สร้าง container ด้วยคำสั่ง

$ docker-compose up -d

  • สร้างเสร็จตรวจสอบ จะได้ container 2 อัน

$ docker ps 

  • จากนั้นให้เราใช้นำเข้า file.sql ที่เรา dump ออกมาจากระบบเดิม นำเข้า wordpress_site ใน container ด้วยคำสั่ง

$ docker exec -i <container_id|name> mysql -u<username> -p<password> <database_name> < /path/file.sql

  • หรืออีกวิธีคือคัดลอกไฟล์จาก host เข้าไปใน child ก่อนโดย

$ docker cp /path/file.sql <container_id|name>:/tmp/file.sql

$ docker exec -it <container_id|name> bash

container$ cd /tmp

container$ mysql -u <username> -p <database_name> < file.sql

  • คอนฟิก wordpress นิดหน่อย wp-config.php (ถ้ายังไม่มีก็ cp จาก sample ได้เลย)
  • ตั้งค่า db host เป็น mysql (ชื่อ server db ของ container mysql เรา ซึ่งเราใช้ชื่อ  service แบบใหนก็ได้ตามใจชอบโดยไม่ต้องเป็น mysql ก็ได้)
  • ตั้งค่า db name, user, pass ตามที่ตั้งค่าเริ่มต้นใน compose file นั่นแหละ
  • จากนั้นเพิ่มคอนฟิกแบบนี้ ก่อน คำสั่งสุดท้าย

...

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {

    $_SERVER['HTTPS'] = 'on';

}

...

/** Sets up WordPress vars and included files. */

require_once(ABSPATH . 'wp-settings.php');

  • table wp_options  column siteurl, home ก็ใช้ค่าเดิม https://www.mysite.com/th ใช้แบบ url ตาม domain หลักก่อน reverse เข้ามาเหมือนเดิม นั่นแหละ

  • stop และ remove container โดย

$ docker-compose down

  • หรือกรณีเราแก้ไข docker-compose จะให้ใช้ คอนฟิกใหม่ก็สั่ง (ทั่วไปใช้แบบนี้ กรณีแก้ไข docker-compose.yml ใช้ -d ก็พอ เร็วดี)

$ docker-compose up -d

  •  หรือเพิ่ม --build แต่จะใช้เวลานาน (ในกรณีที่มีการแก้ไข Dockerfile ควรใช้ --build ใหม่)

$ docker-compose up --build

  • กรณีเราไม่ใส่ networks ให้ service แต่ละตัวก็ได้ มันจะสร้าง network default interface ให้อัตโนมัติเอง ใช้ depends_on แทนได้เช่นกันเอาไว้ผูก service
  • https reverse proxy wordpress ทำไมมันทำเยอะจังกว่าจะรันได้ปกติ เหลือ เรื่อง permission folder upload อีก ปรับให้ถูกต้องด้วย
  • สังเกต restart: always เราใส่ไว้เผื่อเราเข้าไป อัพเดทคอนฟิก 
  • $ docker exec -it apache bash 
  • container$ a2enmod rewrite && service apache2 restart
  • แล้ว ทำให้ container หยุดทำงาน ถ้าเราไม่ใส่ค่านี้ เราต้องสั่ง $ docker start apache เสมอ
  • สุดท้ายเรื่อง permission ใน wp-content/uploads เราจะสามารถจัดการ permission ได้จาก parent host หรือ child. ก็ได้ permission มันเปลี่ยนตามได้หมดเลยแฮะ
Related

  • https://juuier.blogspot.com/2024/09/reverse-proxy-direct-apache-ubuntu-2204.html
  • https://juuier.blogspot.com/2023/05/reverse-proxy-to-multi-endpoint-nginx.html

Ref

  • https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-18-04

Thursday, September 12, 2024

หัดทำ Reverse proxy direct ไปเครื่องอื่นด้วย Apache บน Ubuntu 22.04

 


  • ใน vhost config เพิ่มประมาณนี้

ProxyPreserveHost On

ProxyPass / http://192.168.3.5:8000

ProxyPassReverse / http://192.168.3.5:8000

  • บันทึกแล้ว รีโหลดคอนฟิก

$ sudo systemctl reload apache2

Related

  • https://juuier.blogspot.com/2023/05/reverse-proxy-direct-nginx-ubuntu-2204.html

Monday, July 15, 2024

Block specific URL in htaccess in Wordpress

  • ประเด็นคือ เห็นใน log web มีการเข้าถึง url แปลกใน wordpress เพื่อดูชื่อ  username เข้าระบบของ wordpress

Step

  • สร้าง .htaccess ให้อยู่ระดับสูงสุดของ root site
  • เราจะ block  client ที่เข้าถึงพาธนี้เป็นต้น  https://mysite/wp-json/wp/v2/users/1


  • เพิ่มประมาณ ภายใน ifModule mod_rewrite.c

RewritedCond %{REQUEST_URI} ^/path/site/^

Ref

  • https://wordpress.stackexchange.com/questions/376875/blocking-access-to-all-post-tag-uris-via-htaccess
  • https://stackoverflow.com/questions/72424185/block-specific-url-in-htaccess-in-wordpress

Monday, June 10, 2024

How to find and kill a MySQL process

  • ปกติจะ kill process จาก phpmyadmin แต่มันค้างทำไงล่ะ
Solved
  • เข้าผ่าน CLI ด้วยสิทธิ์ที่ประมาณ root เลย
  • จากนั้นแสดง process list โดย
mysql > show processlist;
  • มันจะแสดงรายการ process mysql ที่กำลังดำเนินการอยู่ หน้าสุด จะแสดง id
  • ให้เรา เอา id นั้นมา ทำลายได้เลยโดย (สมมุติจะ kill id 123)
mysql > kill [id]
mysql > kill 123
Ref
  • https://phoenixnap.com/kb/how-to-kill-mysql-process
  • https://docs.pantheon.io/guides/mariadb-mysql/kill-mysql-queries

Wednesday, June 5, 2024

Firebase web push notify

Ref

https://www.youtube.com/watch?v=iz5arafmatc

https://firebase.google.com/docs/cloud-messaging/concept-options

https://www.youtube.com/watch?v=r7vBNDL6NUE

https://www.youtube.com/watch?v=9qIIjv17IgQ

Tuesday, June 4, 2024

หัดใช้ Fail2ban ใน Ubuntu

  • ประเด็นคือ late limit login failed สำหรับ web site ที่เราพัฒนาเอง
  • การทำงานก็จะประมาณมี service สักตัวคอยไป monitor log ไฟล์ ถ้าเจอสิ่งผิดปกติตามเงื่อนไขที่ตั้งไว้ตาม  filter เราก็จะให้ action อะไรบ้าง ประมาณนี้
  • สิ่งที่จะคอนฟิก คือ drop package ไว้ด้วย firewall สัก 1 ชั่วโมง ถ้า login web site ล้มเหลวประมาณ 5 ครั้งในระยะเวลาช่วง 10 นาที เป็นต้น
Env
  • Fail2Ban v0.10.2

Step

  • ติดตั้ง fail2ban ด้วยคำสั่ง

$ sudo apt install fail2ban

  • เมื่อติดตั้งเรียบร้อยตรวจสอบสถานะ (มันจะทำงานเป็น service ตัว 1 ในระบบเรา)

$ sudo systemctl status fail2ban 

  • ถ้ายังไปเปิดใช้ก็ start มันซะ

$ sudo systemctl start fail2ban

  • อ้างอิงที่ Ubuntu 22.04 มันจะตั้งค่า [default] ไว้ให้แล้วซึ่ง enabled = false ซึ่ง  [jail] แต่ละอันจะใช้ค่า default ก็ได้ หรือจะกำหนดสำหรับแต่ละ  jail ก็ได้เช่นกัน
  • ที่นี้เรามาสร้าง filter กันก่อนเลย
  • ขั้นแรกสร้างไฟล์ /etc/fail2ban/jail.local เพิ่ม

$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

  • กำหนด whitelist ip default เอาไว้ใช้กับทุก jail (ประมาณบรรทัดที่ 92)

$ sudo nano /etc/fail2ban/jail.local

  • มันถูก comment ไว้อยู่เอา  เช่น เราจะทำ whitelist ip ให้ range 192.168.1.0/24 หรือ อันเดียว 192.168.2.3 

ignoreip = 192.168.1.0/24 192.168.2.3

  • แต่เราสามารถตั้งค่า ignoreip ให้แต่ละ jail แยกกันก็ได้คือกัน โดยวาง ignoreip=xxx ไว้ภายใต้ [jail] แต่ละอัน
  • findtime อันนี้คือ ภายในกี่่นาที ที่เจอ filter เราตั้งค่าไว้ใน log (หน่วยคือ จำนวนครั้งที่นับได้จาก log file เราเงื่อนไขใน filter file ของเรา สามารถกำหนดยแยก jail  ได้เช่นกัน)
  • bantime คือ กำหนดเวลาในการ action ของเราเช่น สั่งให้ firewall block การเข้าถึง server เรากี่นาที่ นับการ monitor เจอ filter ใน log ครบตาม findtime (หน่วยถ้าไม่มีระบุต่อท้าย ค่าเริ่มต้นคือ วินาที สามารถกำหนดแยก jail ได้เช่นกัน)
  • เช่น bantime = 60 หรือ bantime = 60m , bantime = 1h 
  • เริ่มผูกการ monitor กับ web site ที่เราเขียนขึ้นมาโดย
  • เปิดไฟล์ jail.local เพิ่ม jail ของ site เรา

$ sudo nano /etc/fail2ban/jail.local

  • ตัวอย่างตั้งชื่อ jail ว่า[mysite1]
  • enabled = true ก่อนเลย
  • ให้ใช้ filter ชื่อ mysite1
  • ให้ใช้ action คือ iptable (block เลย), linenotify( อันนี้เพิ่ม  action เอง)
  • ให้เรียก monitor file ที่ /var/log/apache/mysite-access.log เช่น ถ้าพบ login failed ใน log

192.168.1.3 - - [04/Jun/2024:11:24:25 +0700] "GET /mygroup/user/loginerror HTTP/1.1" 200 581 "https://mysite.go.th/....

  • ตั้งค่า findtime = 10m คือ ภายในระยะเวลา 10 นาที ถ้า เจอ log ดังตัวอย่าง maxretry = 5 คือ 5 ครั้ง และ bantime = 60m ให้ทำการ block ip ที่พบใน log 60 นาที
  • ให้ action สั่ง iptable เพิ่ม policy block ip นั้น และ ส่ง line notify ให้ admin ด้วย
  • ที่นี้เราต้องเพิ่ม filter สำหรับ jail mysite1 เราโดย

$ sudo /etc/fail2ban/filter.d/mysite1.conf

  • เพิ่มประมาณนี้ และ บันทึกไฟล์ให้เรียบร้อย
  • สุดท้ายเพิ่ม action config file อันที่เราจะใช้ส่ง linenotify อันนี้เราต้องสร้างเอง (action iptables-multiport ใช้สำหรับ block โดย ip อันนี้เป็น action ที่มีให้แล้วแค่เรียกใช้มัน)
$ sudo /etc/fail2ban/action.d/send-line.conf
  • ตัวอย่าง send-line.conf ตอนแรกใช้ curl ส่งเลย แต่มันไม่สะดวก เลยเขียน shell script แยกแล้วเรียกใช้แทนเมื่อ ban และ unban
  • บันทึกให้เรียบร้อย และสั่ง restart service

$ sudo /etc/init.d/fail2ban restart

  • ตรวจสอบสถานะการทำกงาน

$ sudo fail2ban-client status mysite1


  • ถ้าทุกอย่างปกติ จะขั้น detail การ monitor ของ jail นั้นๆ ดังภาพตัวอย่าง

เพิ่มเติม

  • คำสั่งสำหรับดูการทำการว่ามี jail อะไรใช้งานอยู่บ้าง

$ sudo fail2ban-client status

  • ดูเป็นราย jail ด้วยคำสั่ง

$ sudo fail2ban-client status mysite1

  • ดู activity ของ service ทำงานอย่างไรบ้าง 

$ sudo fail2ban-client -d

  • สั่งให้ ban / unban โดยตรงโดย

$ sudo fail2ban-client set [jail-name] ban|unbanip [ip]

$ sudo fail2ban-client set myjail unbanip 192.168.1.2

$ sudo fail2ban-client set myjail banip 192.168.1.2 

  • ลองเปลี่ยนจาก iptable มาใช้ ufw แทนโดย เปลี่ยนค่าของแต่ะล jail ในไฟล์ jail.local
action = iptables-multiport[name=http, port="http,https", protocol=tcp, http-status=429]
action = ufw[application=Apache] # ถ้าเราไม่ใส่ [] มันจะ reject ทุก port (Apache Full ใส่แล้วไม่ทำงานซะงั้น ต้องไปสร้าง ufw app profile name เพิ่มเอานะคับ)

  • บันทึกและ restart service และ ตรวจสอบ ufw status

$ sudo systemctl restart fail2ban

$ sudo ufw status verbose 

  • เพิ่มให้อีกนิด เราจะดู app list ของ ufw โดย

$ sudo ufw app list

  • แล้วถ้าเราต้องการ custom applist ของเราเอาโดย 

$ sudo nano /etc/ufw/applications.d/apache2-utils.ufw.profile 

[MYHTTP]

title=Web Server (HTTP,HTTPS)

description=Apache v2 is the next generation of the omnipresent Apache web server.

ports=80,443/tcp

  • เราก็นำชื่อ application profile ใหม่นี้ไปกำหนด ufw ใน jail เช่น
action = ufw[application=MYHTTP] # reject port 80, 443 เป็นต้น  

  • หรือเราจะสร้าง คอนฟิกไฟล์ profile ใหม่ แล้ววางไว้ภายใต้ /etc/ufw/applications.d/myprofile แล้วเอา section ด้านบนใส่ในไฟล์แล้วบันทึก ก็จะได้ profile ใหม่มาใช้ได้เช่นกัน

Ref

  • https://bornoe.org/blog/2023/09/basic-fail2ban-commands/
  • https://zaiste.net/security/howtos/how-to-setup-fail2ban-ubuntu-18-04/
  • https://confluence.atlassian.com/adminjiraserver0820/using-fail2ban-to-limit-login-attempts-1095777624.html
  • https://araideesite.wordpress.com/2017/03/26/linenotify-part8/
  • https://manpages.debian.org/testing/fail2ban/jail.conf.5.en.html
  • https://serverfault.com/questions/285256/how-to-unban-an-ip-properly-with-fail2ban
  • https://bobcares.com/blog/fail2ban-unban-ip/
  • https://www.youtube.com/watch?v=tCHLrC93KhE
  • https://askubuntu.com/questions/409013/how-do-you-create-an-app-profile-for-ufw

Add a user and grant root privileges on Ubuntu 18.04

  • เพิ่ม user ใหม่ ด้วยคำสั่ง (user ใหม่ที่เพิ่มจะได้กลุ่มใหม่เป็นชื่อ user ด้วย)

# adduser myuser1

  • กรอกข้อมูล profile user ใหม่ หรือ ไม่กรอกก็ได้ สุดท้ายกด Y
  • เพิ่มสิทธิ์ให้ user ใหม่มีสิทธิ์เหมือน root

# visudo หรือ # nano /etc/sudoers.tmp 

  • มองหา

root ALL=(ALL:ALL)ALL

  • เพิ่มบรรทัดนี้ต่อจาก root เพื่อให้ myuser1 มีสิทธิ์เท่า root

myuser1 ALL=(ALL:ALL)ALL

  • กรณีเราจะกำหนดให้ user ที่อยู่ใน group myuser1 ให้มีสิทธิ์เท่า root กำหนดประมาณนี้

%myuser1 ALL=(ALL:ALL)ALL

เพิ่มเติม

  • อีกวิธีคือกำหนดให้ user ใหม่เข้ากลุ่ม sudo ด้วยโดย

$ sudo usermod -aG sudo myuser1

Ref

  • https://www.liquidweb.com/kb/add-user-grant-root-privileges-ubuntu-18-04/

Close root user ubuntu 22.04

  • ประเด็นคือ จะปิดการใช้ user root ใน Ubuntu 
  • เช่น login ด้วย user อื่นที่มีสิทธิ์ root แล้ว su root หรือ sudo -i จะใช้ไม่ได้นะจ้ะ

$ sudo cp /etc/passwd /etc/passwd.old

$ sudo nano /etc/passwd

  • ค้นหาบรรทัดประมาณนี้

root:x:0:0:root:/root:/bin/bash

  • แก้ไขเป็น

root:x:0:0:root:/root:/bin/nologin

เพิ่มเติม

  • คุณต้องแน่ใจว่า มีการกำหนด user อื่นที่มีสิทธิ์เท่า root แล้ว
  • เราคอนฟิกปิด root แล้วคิดว่า ไม่ต้องไปคอนฟิกปิดการ remote ด้วย root ก็น่าจะไม่มีปัญหา
  • แต่ถ้าจะมั่นใจคอนฟิกปิดการ remote ด้วย root (เข้าใจว่าค่า default มันถูกปิดอยู่แล้วนะ)
sudo nano /etc/ssh/sshd_config
  • แก้ไขบรรทัดนี้เป็น no
PermitRootLogin no

Set password complexity policy on Ubuntu 18.04++

  • ประเด็นคือจะตั้ง policy ในการกำหนดรหัสผ่านของ user ที่จะเพิ่มในระบบ  Ubuntu 18.04++
  • เช่น ต้องมีจำนวน 8 ตัวขึ้นไป และมี Upper char อย่างน้อย 1 ตัว และ Lower char และ Digit อย่างน้อย 1 ตัว และ Symbol อย่างน้อย 1 ตัว และ กำหนด อายุของรหัสผ่าน สามารถใช้ได้กี่วันแล้วต้องเปลี่ยนใหม่เป็นต้น

Step

  • ติดตั้ง lib ที่ต้องใช้งานก่อนเลย

$ sudo apt install libpam-pwquality

  • สำหรับสำรองไฟล์คอนฟิก policy ก่อนแก้ไข

$ sudo cp /etc/pam.d/common-password /etc/pam.d/common-password.old

  • จากนั้นเปิดไฟล์แก้ไข 

$ sudo nano /etc/pad.d/common-password

  • ค้นหาบรรทัดประมาณนี้

password    requisite    pam_pwquality.so    retry=3

  • แก้ไขเป็น (คอมเม้นแล้ว โดยใส่เครื่องหมาย  # ด้านหน้าสุด แล้วเพิ่มบรรทัดใหม่)
  • อันนี้ตัวอย่างตามอ้างอิง

# password    requisite    pam_pwquality.so retry=3 minlen=8 difok=3 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 reject_username enforce_for_root

  • เราตั้ง policy เบาๆ ประมาณนี้ก็พอ

password    requisite    pam_pwquality.sol    retry=3    minlen=8    lcredit=-1    ucredit=-1 dcredit=-1    ocredit=-1   
 

  • จากนั้นบันทึกไฟล์ให้เรียบร้อย
  • เข้าใจว่า policy น่าจะมีผลกับการ เปลี่ยนรหัสใหม่ หรือ เพิ่ม user เข้ามาใหม่นะ
  • และ การกำหนดอายุของรหัสผ่านโดยแก้ไขไฟล์ /etc/login.defs (อย่าลืมสำรองไว้ด้วยกันเหนียว)

$ sudo nano /etc/login.defs

# line 165 : set password Expiration days (example below means 60 days)

PASS_MAX_DAYS 60

Ref

  • https://kifarunix.com/enforce-password-complexity-policy-on-ubuntu-18-04/
  • https://www.server-world.info/en/note?os=Ubuntu_22.04&p=pam&f=1#google_vignette

Friday, May 31, 2024

ทบทวน ​Permission linux file & folder

ตัวอย่าง

เพิ่ม-ลด สิทธิ์ให้เจ้าของ file / folder (คือไม่ต้องใส่ u/g/o นำหน้า operator)

# chmod +r myfile

# chmod +rwx myfile

# chmod -r myfile

# chmod -rwx myfile

# chmod -rw myfolder

การจัดการ permission สำหรับแต่ละประเภท user

# chmod ugo+rwx myfile

# chmod g+rw myfile

# chmod go-rw myfile 

# chmod u=rwx,g=rx myfile

# chmod -R u=rwx,go=rx myfolder

# chmod ugo=rwx myfile

# chmod a=rwx myfile

# chmod -R ug=rwx myfolder

Ref

  • https://www.pluralsight.com/blog/it-ops/linux-file-permissions
  • https://stackoverflow.com/questions/17091300/linux-set-permission-only-to-directories

Friday, May 17, 2024

Add user linux to group

  • ประเด็นคือ มี user ในระบบแต่ build docker compose ไม่ได้ ทำไงล่ะ
  • วิธีแรก ให้ root build แทน
  • วิธีสอง เพิ่ม group docker ให้กับ user นั้นก็จะ build compose ให้คำสั่ง docker ได้

เพิ่ม/ลบ/แสดง groups 

$ sudo groupadd mygroups

$ sudo groupdel mygroup

$ sudo grep mygroup /etc/group 

ดู group ของ user โดย

$ groups myuser

mygroup : mygroup

หรือ ดู group ของ user ที่กำลังทำงานอยู่คือ

$ groups

myuser docker

เพิ่ม user เข้าใน group โดย

 # usermod -aG mygroup myuser

Exam: เพิ่ม myuser เข้ากลุ่ม docker 

# usermod -aG docker myuser

Exam: จะเพิ่ม myuser ให้อยู่ในกลุ่ม sudo เพื่อจะได้สิทธิ์เหมือนเป็น root เลยโดย

# usermod -aG sudo myuser

ลบ user ออกจาก group

# gpasswd -d myuser mygroup

หรือ 

# deluser myuser mygroup

เพิ่มเติม

  • การดู group สามารถดูได้จาก user ใหนก็ได้
  • แต่การเพิ่ม group น่าจะต้องใช้สิทธิ์ root , sudo ทำเท่านั้น

Ref

  • https://www.strongdm.com/blog/add-user-to-linux-group
  • https://www.tecmint.com/add-or-remove-user-from-group-in-linux/
  • https://www.pluralsight.com/blog/tutorials/linux-add-user-command

Sunday, March 24, 2024

Authentication plugin 'caching_sha2_password' cannot be loaded

  • ประเด็นมีอยู่ว่า mysql client บน Window 10 จะ remote connect MySQL บน Ubuntu 22.04 ซึ่งน่าจะติดตั้ง MySQL 8.0 ไว้นะคิดว่า

mysql -h remote_host -u user -p

  • แล้วได้ error ดังหัวเรื่อง

Authentication plugin 'caching_sha2_password' cannot be loaded

  • แต่ลองทดสอบ remote  connect ด้วย navicat client กลับเชื่อมต่อได้ซะงั้น
  • ทดสอบบน window เครื่องอื่น ก็ได้ error แบบเดียวกัน
  • สรุปคือ MySQL ตอนสร้าง user และ password ค่าเริ่มต้นการเข้ารหัสจะเป็น sha2 แน่เลย
  • ซึ่งทำให้ mysql client ที่ใช้ version เก่าอยู่ไม่มีตัว plugin sha2 authen แน่ๆ เลย
  • แก้ปัญหาโดย เปลี่ยนการ authen ของ user นั้นเป็นแบบ standard

Solved

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newrootpassword';

Ref

  • https://stackoverflow.com/questions/49194719/authentication-plugin-caching-sha2-password-cannot-be-loaded

Install Java SKD 11 on MacOS ARM

  • ประเด็นคือเขียน flutter โดยใช้ Android Studio  จะติดตั้งบน Android Mobile debug mode
  • แต่ฟ้องล้มเหลวประมาณว่า ต้องการ java 11 ซะงั้น 

Step

$ brew install java11

  • path ที่ติดตั้งน่าจะอยู่ประมาณ /opt/openjdk11 ประมาณนี้
  • ตั้งค่าให้เลือกใช้ได้แบบ global ประมาณนี้

$ sudo ln -sfn /opt/openjdk@11/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-11.jdk

  • ตรวจสอบเวอร์ชั่น java

$ java --version

Ref

  • https://medium.com/@kirebyte/using-homebrew-to-install-java-jdk11-on-macos-2021-4a90aa276f1c

CLI HTTP and API testing client for the API era.

  • ประเด็น ใช้ curl บน ubuntu 22.04 แล้วคิดว่ามันเอ๋อ (จริง เป็นที่โค้ดตัวเองเน้นๆ ที่มั่วเอง)
  • เลยลองหา cli http client มาใช้ทดสอบดูสิ ว่าได้ผลลัพธ์แบบ curl หรือป่าว
  • สรุปคือได้ผลเหมือนกันกับ curl แต่ก็ดีมี tool ตัวอื่น ไว้ใช้อีกตัว ง่ายๆ เหมือน curl

Install on ubuntu 22.04

$ snap install httpie

Usage ex

$ https httpie.io/hello

$ http PUT pie.dev/put X-API-Token:123 name=John

$ http -f POST pie.dev/post hello=World

Ref

  • https://httpie.io/cli

Monday, February 12, 2024

How to Execute a POST Request with JSON Payload with cURL

  • ทดสอบใช้ CURL บน linux Ubuntu 22.04 เพื่อทดสอบ Restfull api

Pattern

curl -X POST [URL] -H "Content-Type: application/json" -d [JSON_PAYLOAD]

Ex

curl -X POST http://example.com/api/data -H "Content-Type: application/json" -d '{"name": "John Doe", "age": 25}'

curl -X POST http://example.com/api/data -H "Content-Type: application/json" -d @data.json
Ref

  • https://tecadmin.net/post-json-data-with-curl-command/
  • https://www.linode.com/docs/guides/curl-for-rest-api/

Thursday, February 1, 2024

Add Multiple Hosts in phpMyAdmin

  • ปกติเราจะติดตั้ง phpmyadmin ไว้กับเครื่องที่มีฐานข้อมูลอยู่
  • แต่อยากใช้ phpmyadmin กับ remote host อื่นๆ ด้วย

Env

  • Ubuntu 22.04 + Nginx + PHP 8.3 + MySQL 
  • phpmyadmin 5.2.1

Method

  • ดาวน์โหลด zip file จาก https://www.phpmyadmin.net/downloads/ 
  • นำไปวางและแตกไฟล์ไว้ /var/www/html/phpmyadmin
  • จากนั้น คัดลอกไฟล์ชื่อ config.sample.inc.php  -> config.inc.php
  • แล้วเพิ่มประมาณนี้

  • ทดสอบระบบ http://localhost/phpmyadmin

Ref

  • https://tecadmin.net/add-multiple-hosts-in-phpmyadmin/

Tuesday, January 9, 2024

node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by node)

$ node -v

node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by node)

Solved

  • ปัญหาคือ Ubuntu version เราไม่ support nodejs v 20
  • ทางแก้คือ upgrade os ubuntu ให้สูงกว่า 18.04
  • หรือ เปลี่ยน nodejs กลับไปเป็น version 16 คือเก่า ในที่นี้เราจะใช้ nvm (ตัวติดตั้งโดยเลือก เวอร์ชั่นที่เราต้องการได้เลย ) ติดตั้งและตั้งค่าไปใช้อันที่ติดตั้งใหม่
  • ขั้นแรกต้องลง nvm ให้ระบบเราก่อน

$ sudo curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash

$ sudo nano $HOME/.bashrc

  • เพิ่มไว้ด้านล่างสุดของไฟล์ .bashrc

check=' export NVM_DIR="$HOME/.nvm"'

if ! grep -qF "$check" ~/.bashrc; then

    echo "" >>~/.bashrc

    echo "# Add NVM to path" >>~/.bashrc

    echo 'export NVM_DIR="$HOME/.nvm"' >>~/.bashrc

    echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >>~/.bashrc

    echo '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"' >>~/.bashrc

fi

  • จากนั้นใช้ สลับกลับไปใช้อันเดิมโดย (เราจะได้  16 -> 16.20.2)

$ nvm install 16 

$ nvm use 16

Add

  • ถ้าเราต้องใช้ติดตั้ง node lts version ล่าสุดใช้คำสั่ง 

$ nvm install --lts

  • ติดตั้งโดยระบุเวอร์ชั่น ล่าสุดของ 16 -> 16.20.2

$ nvm install 16

  • หรือติดตั้งระบุเวอร์ชั่นแบบระบุ 16.15.1 (Ubuntu 18.04 apt install nodejs จะได้เวอร์ชั่นนี้)

$ nvm install 16.15.2

  • กรณีสลับ version การ node ที่เราได้ติดตั้งไว้แล้วในระบบคือ

$ nvm use 16.15.1

$ nvm use 18 (อันนี้ก็ใช้ใน Ubuntu 18.04 ไม่ได้เช่นกัน)

$ nvm use 20

  • เช็ค GLIB ของ OS เราด้วยคำส่ง

$ ldd --version

Ref

  • https://stackoverflow.com/questions/72921215/getting-glibc-2-28-not-found

Resetting an out-of-range resolution Ubuntu 22.04

ปัญหา

  • ใช้ XORG Desktop  แล้วปรับ resolution สูงเกินไป monitor แสดง out-of-range resolution 
  • พอ restart ขึ้นหน้า login เข้า XORG Desktop มันก็แสดง resolution out of range เหมือนเดิม
  • ประเด็นที่ต้องใช้ XORG อยู่คือ Wayland ใช้ Shutter กับ Barrier มันไม่เสถียร เลย

Solved

Method 1 ใช้ Wayland แทน 

  • เข้าหน้า login แล้วเลือก Wayland Desktop แทน

Method2 ถ้าจะใช้ XORG Desktop เหมือนเดิม 

  • พอเข้าหน้า Login ให้สลับ shell โดยกดปุ่ม Ctrl+Alt+F2
  • login  CLI ด้วย user และ password ที่เราใช้เข้าระบบ  และ ลบ ~/.config/monitors.xml

$ rm ~/.config/monitors.xml

$ sudo reboot 

Ref

  • https://wiki.ubuntu.com/X/Config/Resolution

Tuesday, January 2, 2024

How to secure MongoDB with username and password

  • อ้างอิงบน Mogodb 6.0.12 ($ mongos --version)
  • คอนฟิกให้ remote ด้วย user & password จาก host ใหนก็ได้

$ sudo cp /etc/mongod.conf /etc/mongod/conf.old

$ sudo nano /etc/mongod.conf

......

# enable authen username & password

security:

  authorization: enabled

..........

# allow any remote

net:

    # bindIp: 127.0.0.1,192.168.1.0/24

    bindIp: 0.0.0.0

  • เพิ่ม User ผูกกับ db นั้น
  • โดยจัดการอยู่ที่  mogodb server ใช้ mongosh

$ mongosh

> use admin

> db.createUser({

  user: "myadmin",

  pwd: "password",

  roles: [ { role: "root", db: "mydb" } ]

}) 

  • ทดสอบ remote mongodb จาก client เครื่องอื่น

$ mongosh --host IPMongodb --port 27017 -u "myadmin" -p "password" --authenticationDatabase "mydb"

Ref

  • https://stackoverflow.com/questions/4881208/how-to-secure-mongodb-with-username-and-password
  • https://tecadmin.net/how-to-install-mongodb-on-ubuntu-22-04/