Skip to content

Cơ bản về Nguyễn Hồng Sơn

Bá tước Monte Cristo

Cuộc đời, sự nghiệp trả thù của Monte Cristo (tên thật là Edmond Dantès), được kể lại qua lời văn của Dumas, chỉ gói gọn trong mấy trăm trang sách, mang hơi hướng huyền thoại và siêu thực. Cuối cùng, sự trả thù rồi sẽ chả đi tới đâu mà chỉ sự tha thứ mới làm chính ta thanh thản.

Dantès là một thủy thủ xuất sắc, trong cái thời đại mà châu Âu đi khai thác thuộc địa, dần dần trở thành thuyền phó, xuất sắc đưa tàu và hàng trở về trong chuyến đi mà thuyền trưởng của anh đã qua đời trên biển. Trước lúc ra đi, thuyền trưởng nhờ anh gửi lá thư cho Napoléon Bonaparte, sau đó Bonaparte nhờ anh gửi thư cho thân tín của mình tại Paris. Trong giờ phút sung sướng vì sắp lấy vợ, anh bị bắt do viên kế toán tàu báo cáo chính quyền mới tội thông đồng với Hoàng đế phản loạn. Anh bị tống vào tù và bị vu oan đủ đường.

Dantès bị nhốt vào tù với một mục sư điên, người cứ mãi luyên thuyên về của cải ngoài biển của ông ta. Sau khi chạm mặt, mục sư cho biết ông giả điên và rằng, kho báu là có thật. Mục sư nhận anh làm học trò và dạy anh tri thức quý giá. Ròng rã hơn 10 năm trời, anh và mục sư bàn cách vượt ngục nhưng nó đã không thể xảy ra, mục sư chết trước đó. Thông qua lối đi bí mật được đào giữa hai phòng giam, anh tráo bản thân mình với xác của mục sư và thuận lợi ra ngoài khi cai ngục dọn thi thể. Anh bị vứt xuống hồ nhưng rồi đã thoát được.

Anh tìm đến đảo Monte Cristo theo lời mục sư, và quả thực ở đây có kho tàng. Dantès giờ đây đã thành Bá tước Monte Cristo. Anh trở về, báo ơn và trả thù những kẻ đã bức hại anh. Trừ người phụ nữ mà anh suýt cưới, giờ đã là vợ của kẻ báo án anh.

Mình không thích cốt truyện lắm. Nó siêu thực và làm cho mình cảm thấy, nếu bị bất công thì cứ đi tìm kho tàng và rồi ta sẽ sức mạnh để trả thù. Có lẽ trong cái thời của Dumas, truyện như vậy được mọi người yêu mến. Nhưng mình, không thấy rằng nó đáng là điều để tâm đắc.

Sapiens

Đây là lần thứ hai mình đọc cuốn sách này, với một tâm thế khác hoàn toàn so với lần đầu. Một tâm thế đọc như là đang nghiên cứu một tài liệu khoa học, chứ không đơn thuần là đọc một cuốn sách nữa. Vì vậy, mình tốn nhiều thời gian hơn, cho cả việc đọc và viết những dòng nhìn lại nội dung này.

Tác giả cuốn sách là một nhà nghiên cứu lịch sử người Israel, hiện đang là giáo sư Sử học tại Đại học Hebew. Đoạn giới thiệu về ông trong sách bản tiếng Việt rất ngắn, mình đã tìm hiểu và đọc thêm trên wikipedia và website của ông. Có lẽ vì nhạy cảm, nên ấn bản Việt Nam đã không đề cập rằng ông là một người đồng tính, đã kết hôn với người đại diện và cũng là cộng sự của mình tại Canada. Thông tin trên website của ông chủ yếu là quảng bá sách và quỹ Sapienship của ông.

Cuốn sách viết công phu và tỉ mỉ, số lượng trích dẫn nhiều đáng kinh ngạc. Lượng tri thức cung cấp trong sách đồ sộ nhưng khá gần gũi và dễ hiểu, trải dài nhiều vấn đề: sự tiến hóa của con người từ loài vượn (theo thuyết tiến hóa tổng hợp), nông nghiệp và công nghiệp đã nâng tầm sức mạnh của con người trong thế giới vật chất ra sao, trật tự xã hội hình thành trên những ảo tưởng liên chủ quan như thế nào, chủ nghĩa tư bản, cộng sản, đế quốc đã hình thành và thay đổi thế giới bằng cách nào, Chúa hay đức Phật, hay một vị thần linh bất kỳ của Ấn Độ giáo hay các hiền triết Trung Hoa, Hy Lạp dạy những gì.

Tuy vậy, phải nhìn nhận rằng tác giả viết theo lối trung dung, dễ dàng tiếp thu nhưng cũng không thể hiện hoàn toàn quan điểm của ông. Có lẽ, quan điểm của ông chính là quan điểm của người làm Sử chính tắc, không dựa vào vài chục, vài trăm năm để đánh giá toàn bộ xã hội loài người, cũng như không dựa vào vài sự kiện để đánh giá một trường phái triết học, Nhà nước hay tôn giáo.

Trong quá trình đọc sách với tâm thái nghiên cứu, mình note và ghi chú lại ở nhiều trang sách. Trong quá trình viết bài này, mình lật mở lại từng ghi chú và viết về chúng. Mình đã bỏ qua một số note, bởi lúc đọc ngay dòng đó thì mình thấy nó khá hay. Nhưng khi viết reivew, mình thấy nó không còn hay như lúc đọc lần đầu; hoặc tương tự như người dịch, mình thấy nó quá nhạy cảm để đề cập.

Nguồn gốc mâu thuẫn dẫn đến xảy ra biểu tình lớn ở Israel

Trong bối cảnh những vấn đề phức tạp giữa hai nhà nước Israel và Palestine vẫn đang được thảo luận và giải quyết trên nghị trường Liên Hợp Quốc, thì Israel đang đứng trước bờ vực nội chiến với việc dân chúng biểu tình phản đối đề xuất cải cách tư pháp mới của tân Thủ tướng Netanyahu. Ông Netanyahu tuyên bố không nhượng bộ trước áp lực.

Liên minh cực hữu, dân tộc - tôn giáo của Thủ tướng Netanyahu đề xuất một cải cách mà thông qua đó, hạn chế quyền lực của tòa án tối cao, trao nhiều quyền hơn cho Chính phủ và Quốc hội (nơi mà liên minh của ông đang chiếm đa số). Các cải cách chủ yếu nhằm vào một số nội dung:

  1. Về sự lựa chọn các thẩm phán của tòa án tối cao

    • Hiện tại: Một hội đồng có 9 thành viên bao gồm: 3 người là đương nhiệm thẩm phán tối cao pháp viện; 2 người là đại diện của đoàn luật sư; 2 người là nghị sĩ Quốc hội (Quốc hội Israel có 120 ghế) và 2 người là Bộ trưởng. Việc lựa chọn Thẩm phán Tối cao pháp viện cần đa số phiếu tuyệt đối tức 7/9 phiếu.

    • Đề xuất mới: Một hội đồng gồm 11 thành viên bao gồm: Bộ trưởng Tư pháp là chủ tịch; 2 Bộ trưởng; 1 nghị sĩ quốc hội là chủ tịch ủy ban hiến pháp, pháp luật và tư pháp; 1 nghị sĩ quốc hội là chủ tịch ủy ban kiểm soát Nhà nước; 1 nghị sĩ quốc hội là Chủ tịch quốc hội; 1 thẩm phán là chủ tịch tối cao pháp viện; 2 người là đương nhiệm thẩm phán tối cao pháp viện; 2 public representatives cho bộ trưởng Tư pháp lựa chọn.

    • Như vậy, chính phủ (mà thông thường được thành lập bởi Đảng/Liên minh cầm quyền) có đa số phiếu tuyệt đối để bổ nhiệm các thẩm phán tối cao pháp viện. Hệ thống cũ không cho phép điều này.

  2. Phủ quyết luật của Quốc hội thông qua

    • Ở hiện tại, tối cao pháp viện của Israel có quyền phủ quyết một luật cơ bản do Quốc hội thông qua (Israel không có hiến pháp tối cao)

    • Đề xuất mới hạn chế quyền này, không trao cho tối cao pháp viện quyền được "review" các luật của quốc hội thông qua.

  3. Quyền của quốc hội

    • Hiện tại, quốc hội không thể đảo ngược quyết định của tối cao pháp viện

    • Đề xuất mới cho phép quốc hội, với chỉ đa số cơ bản (>1/2) phủ quyết quyết định của tối cao pháp viện.

  4. Quyền được lựa chọn cố vấn tư pháp cho bộ trưởng

    • Đề xuất mới cho phép các bộ trưởng tự lựa chọn cố vấn tư pháp cho họ (vốn hiện tại không thuộc quyền của bộ trưởng) đồng thời giảm quyền của cố vấn (từ bắt buộc nghe theo thành mang tính tham khảo).
  5. Quyền tư pháp đối với chính phủ

    • Đề xuất mới hạn chế phạm vi các quyết định hành chính của chính phủ phải bị xem xét bởi tối cao pháp viện, đồng thời ngăn cản tòa án xét xử các đơn kiện, kháng cáo đối với chính phủ.

Nhìn chung, đây là sự tranh đấu chính trị giữa các bên, một bên đòi hỏi sự tự do cho nhiều thành phần thiểu số ở một quốc gia phức tạp về sắc tộc, tôn giáo như Israel, một bên là cực hữu dân tộc chủ nghĩa - tôn giáo mong muốn một hệ thống phục vụ cho lợi ích của họ. Những thay đổi tư pháp này cho phép Quốc hội phủ quyết các rắc rối tư pháp về việc truy tố ông Netanyahu tội tham nhũng và nhận hối lộ, đồng thời cũng cho phép quốc hội thông qua luật miễn nghĩa vụ quân sự đối với những tín đồ Do Thái giáo chính thống cực đoan để họ nghiên cứu tôn giáo.

Tạo user và grant root permission trên linux

ShellScript này tạo một người dùng mới và thêm vào nhóm 'wheel'. Với khả năng nhập thông tin từ bàn phím như tên người dùng, mật khẩu và publickey, đơn giản hóa quá trình quản lý người dùng trên hệ thống Linux.

Full code

adduser.sh
# =========================================
# Date      : 2023-09-29 17:13:59
# Author    : Son Nguyen-Hong ([email protected])
# Link      : sonnh.net
# File      : adduser.sh
# =========================================

#!/bin/bash

USER='sonnh11' # Input your username here
PASSWD=''      # Input your password. If not, use random password
PUBLIC_KEY=$(<public_key)

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
PLAIN='\033[0m'
PACKAGE_COMMAND=''
SECRET_FILE='secret.txt'

# check root
if [ $(/usr/bin/id -u) -ne 0 ]; then
    printf "${RED}Error: This script must be running as root${PLAIN}\n"
    exit 1
fi

OS_check() {
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        case $NAME in
        "Ubuntu")
            OS_FAMILY=1 #define a variable for OS family
            PACKAGE_COMMAND="apt-get"
            ;;
        "CentOS Linux" | "Red Hat Enterprise Linux" | "Amazon Linux")
            OS_FAMILY=2
            PACKAGE_COMMAND="yum"
            ;;
        *)
            printf "${YELLOW}Error: OS not supported${PLAIN} \n"
            exit 1
            ;;
        esac
    else
        printf "${RED}Error:  Cannot check OS information${PLAIN}\n"
        exit 1
    fi

    if [ ! -e '/usr/bin/openssl' ]; then
        $PACKAGE_COMMAND -y install openssl
    fi

    # install ssh
    if [ ! -e '/usr/bin/ssh' ]; then
        $PACKAGE_COMMAND -y install openssh-server openssh-clients >/dev/null 2>&1 
        systemctl start sshd >/dev/null 2>&1 
        systemctl enable sshd >/dev/null 2>&1
    fi
}

generate_secret() {
    echo "adduser.sh help?
    ${GREEN}sudo ./adduser.sh username public_key password
    ${PLAIN}or if you fill username in scirpt and provide public key in file template
    ${GREEN} sudo ./adduser.sh ${PLAIN}
    "
    if [ -z "$1" ] && [ -z "$2" ] && [ -z "$3" ]; then
        USER=$1
        PUBLIC_KEY=$2
        PASSWD=$3
    elif [ -z "$USER" ]; then
        echo "${RED}Error: You not yet provide username${PLAIN}"
        shift 63
    fi

    if [ -z "$PASSWD" ]; then
        echo "${YELLOW}Warning: You use auto generate password${PLAIN}"
        PASSWD="$(
            echo $RANDOM | md5sum | head -c 20
            echo
        )"
        echo "Your password is:" "$PASSWD" >> $SECRET_FILE
    fi

    if [ -z "$PUBLIC_KEY" ]; then
        echo "${YELLOW}Warning: You use auto generate public key${PLAIN}"
        ssh-keygen -q -t rsa -N '' -f ~/secret <<<y >/dev/null 2>&1
        PUBLIC_KEY=$(cat ~/secret.pub)
        echo "Your secret key is below.\n" "$($cat ~/secret)" >> $SECRET_FILE
    fi
    rm -rf ~/secret secret.txt

}

addnewUser() {
    if [ ! -d "/home/$USER" ]; then
        if [[ $OS_FAMILY -eq 1 ]]; then #ubuntu
            adduser --disabled-password --gecos "" $USER
            echo $USER:$PASSWD | chpasswd
        else #centos and ret hat
            adduser -p $(openssl passwd -1 $PASSWD) $USER
        fi
    else
        printf "${RED}Error: ${PLAIN} Add user fail!\n"
    fi

    echo "$USER  ALL=(ALL) NOPASSWD:ALL" | sudo tee "/etc/sudoers.d/$USER"
    usermod -aG wheel "$USER"

    mkdir /home/$USER/.ssh
    chmod 700 /home/$USER/.ssh
    chown $USER:$USER /home/$USER/.ssh
    echo "$PUBLIC_KEY" >/home/$USER/.ssh/authorized_keys
    chmod 700 /home/$USER/.ssh/authorized_keys
    chown $USER:$USER /home/$USER/.ssh/authorized_keys

}

main() {
    OS_check
    generate_secret
    addnewUser

}

main

Explanation

Variable

  • USER: Biến chứa tên người dùng, mặc định là 'sonnh11'.

  • PASSWD: Biến chứa mật khẩu, cho phép nhập từ bàn phím hoặc nhúng vào code. Nếu không, tự tạo một chuỗi mật khẩu ngẫy nhiên

  • PUBLIC_KEY: Biến chứa public key, được đọc từ tệp public_key. Có thể nhập từ bàn phím để ghi đè nội dung trong file. Nếu cả nội dung trong file và nhập từ bàn phím đều trống, tự generate một public key

Màu Sắc:

  • RED, GREEN, YELLOW, PLAIN: Biến chứa mã màu để làm cho in ra màn hình dễ đọc.

Các Bước Kiểm Tra:

  • Kiểm tra xem script được chạy với quyền root không.

  • Kiểm tra hệ điều hành để xác định gia đình hệ điều hành (Ubuntu hoặc CentOS/RHEL) và thiết lập các biến liên quan.

  • Kiểm Tra và Cài Đặt Gói:

    • Kiểm tra xem openssl đã được cài đặt hay chưa. Nếu không, cài đặt nó.
    • Kiểm tra xem ssh đã được cài đặt hay chưa. Nếu không, cài đặt và khởi động dịch vụ SSH.

Các hàm sử dụng

Hàm generate_secret:
  • Hướng dẫn sử dụng script và các tham số cần truyền.

  • Nếu các tham số không được cung cấp, sử dụng giá trị mặc định và tạo ra mật khẩu và public key nếu chúng không được cung cấp.

Hàm addnewUser:
  • Tạo người dùng mới nếu thư mục người dùng không tồn tại.

  • Thêm người dùng vào nhóm wheel và cấp quyền sudo.

  • Tạo thư mục .ssh và đặt quyền truy cập public key.

Hàm main:
  • Gọi các hàm theo thứ tự để thực hiện các bước chính của chương trình.

Lưu ý:

  • Script kiểm tra quyền root để đảm bảo an toàn khi thực hiện các thay đổi hệ thống quan trọng.

  • Tương tác với người dùng để nhập thông tin cần thiết, như mật khẩu và khóa công khai.

  • Sử dụng biến màu sắc để cải thiện trải nghiệm người dùng khi hiển thị thông điệp.

Hướng dẫn cài đặt địa chỉ ảo bằng Keepalived trên linux

Khởi tạo máy ảo

  • Giống như các bài lab khác, ta sử dụng Vagrant để tạo các máy ảo phục vụ cho bài lab. Dưới đây là Vagrantfile cho bài lab này
    Vagrant.configure("2") do |config|
        config.ssh.insert_key = false
        config.vm.define "keepalived-1" do |cf1|
          cf1.vm.box = "centos/7"
          cf1.vm.hostname ="keepalived-1"
          cf1.vm.network :private_network, ip: "10.0.0.10"
          cf1.vm.provider "virtualbox" do |vb|
              vb.memory = "2000"
          end
        end
    
        config.ssh.insert_key = false
        config.vm.define "keepalived-2" do |cf1|
          cf1.vm.box = "centos/7"
          cf1.vm.hostname ="keepalived-2"
          cf1.vm.network :private_network, ip: "10.0.0.15"
          cf1.vm.provider "virtualbox" do |vb|
              vb.memory = "2000"
          end
        end
    
    end
    
  • Run vagrant và ssh vào máy ảo
    vagrant up
    

Cài đặt các package cần thiết để build

  • Cài đặt kernel
    yum -y install kernel-headers kernel-devel curl gcc openssl-devel libnl3-devel net-snmp-devel wget
    

Cài đặt keepalive

  • Download keepalive
    cd /opt
    wget https://www.keepalived.org/software/keepalived-2.2.8.tar.gz --no-check-certificate
    tar -xvzf keepalived-2.2.8.tar.gz
    ln -s keepalived-2.2.8 keepalived
    cd keepalived
    ./configure --prefix=/usr/local/keepalived
    make && make install
    
  • Bạn có thể build đồng thời trên 2 VM hoặc build trên 1 VM rồi sync sang VM còn lại. Nếu sử dụng phương án 2, chú ý rằng các package vẫn phải được cài đặt đầy đủ.

Cấu hình keepalive

  • Tạo file cấu hình
    • Trên MASTER: 10.0.0.10
      /usr/local/keepalived/etc/keepalived.conf
      vrrp_instance KEEPALIVED_VIP {
          state MASTER # or "BACKUP" on backup
          mcast_src_ip 10.0.0.10
          interface eth1
          priority 101 # 101 on master, 100 on backup
          virtual_router_id 101
          advert_int 1
          use_vmac
          #smtp_alert # Activate SMTP notifications
      
          authentication {
              auth_type PASS
              auth_pass keepalivedlab_pass
          }
      
          virtual_ipaddress {
              10.0.0.100/24 dev eth0
          }
      }
      
    • Trên SLAVE 10.0.0.15
      /usr/local/keepalived/etc/keepalived.conf
      vrrp_instance KEEPALIVED_VIP {
          state BACKUP # or "BACKUP" on backup
          mcast_src_ip 10.0.0.15
          interface eth1
          priority 100 # 101 on master, 100 on backup
          virtual_router_id 102
          advert_int 1
          use_vmac
          #smtp_alert # Activate SMTP notifications
      
          authentication {
              auth_type PASS
              auth_pass keepalivedlab_pass
          }
      
          virtual_ipaddress {
              10.0.0.100/24 dev eth0
          }
      }
      
  • Tạo file binary để quản lý keepalive
    /opt/init.d/keepalived
    #!/bin/sh
    #
    # Startup script for the Keepalived daemon
    #
    # processname: keepalived
    # pidfile: /var/run/keepalived.pid
    # config: /usr/local/keepalived/etc/keepalived.conf
    # description: Start and stop Keepalived
    
    # Global definitions
    PID_FILE="/var/run/keepalived.pid"
    BIN_DIR="/usr/local/keepalived/sbin"
    CONFIG_DIR="/usr/local/keepalived/etc"
    RETVAL=0
    # source function library
    . /etc/init.d/functions
    
    start() {
        echo -n "Starting Keepalived for LVS: "
        daemon $BIN_DIR/keepalived -f $CONFIG_DIR/keepalived.conf -D --log-facility 5
        RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && touch /var/lock/subsys/keepalived
            return $RETVAL
    }
    
    stop() {
        echo -n "Shutting down Keepalived for LVS: "
        killproc keepalived
        RETVAL=0
            echo
            [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/keepalived
            return $RETVAL
    }
    
    reload() {
        echo -n "Reloading Keepalived config: "
        killproc keepalived -1
        RETVAL=$?
            echo
            return $RETVAL
    }
    
    # See how we were called.
    case "$1" in
      start)
            start
            ;;
      stop)
            stop
            ;;
      restart)
            stop
            start
            ;;
      reload)
            reload
            ;;
      status)
            status keepalived
            ;;
      condrestart)
            [ -f /var/lock/subsys/keepalived ] && $0 restart || :
            ;;
      *)
        echo "Usage: $0 {start|stop|restart|reload|condrestart|status}"
        exit 1
    esac
    
    exit 0
    ~        
    
  • Start keepalive
    chmod +x /opt/init.d/keepalived
    /opt/init.d/keepalived start