Genel

YugabyteDB Nedir ? YugabyteDB Cluster Kurulumu (With Node to Node TLS)

YugaByteDB, yüksek verimli, ölçeklenebilir ve dağıtık bir veritabanı yönetim sistemidir (DBMS). Özellikle modern bulut uygulamaları için tasarlanmış olup, SQL ve NoSQL özelliklerini bir arada sunar. YugaByteDB, PostgreSQL uyumlu bir veritabanı sunmakta ve aynı zamanda NoSQL özelliklerini de entegre ederek esnek veri modellemesi sağlar.

Bu yazıda YugabyteDB’nin node-to-node ssl sertifikası ile 3 master ve 3 adet tablet server olarak kurulum yapılacaktır. Önce root ve node sertifikaları oluşturulacak ardından server kurulum adımlarına geçilecektir.

Sunucu Mimarisi ve Ön Gereksinimler

CPU2 Core
RAM4 GB
DISK70 GB
  • Sunucularda yugabyte adında bir user tanımlaması yapılmalıdır.

SSL Sertifikaların Olusturulması

SSL sertifika dosyalarını saklamak için secure-data adında bir dosya oluşturulmalıdır.

mkdir secure-data   

Node sertifikalarını geçici olarak saklamak için aşağıdaki directory’ler oluşturulur.

mkdir -p secure-data/node.192.168.1.39 secure-data/node.192.168.1.40 secure-data/node.192.168.1.41

Root Sertifikanın Olusturulması

Root sertifikasını oluşturmak için ca.conf adında bir dosya oluşturulur. (CA=Certificate Authority) Bu dosya sertifikanın ihtiyaç duyduğu parametreleri barındırmaktadır.

cat > secure-data/ca.conf <<EOF
[ ca ]
default_ca = my_ca

[ my_ca ]
# Validity of the signed certificate in days
default_days = 3650

# Text file with next hex serial number to use
serial = secure-data/serial.txt

# Text database file to use, initially empty
database = secure-data/index.txt

# Message digest algorithm. Do not use MD5
default_md = sha256

# Section with a set of variables corresponding to DN fields
policy = my_policy

[ my_policy ]

# Policy for nodes and users. If the value is "match", then
# field value must match the same field in the CA certificate.
# If the value is "supplied", then it must be present. Optional
# means it may be present
organizationName = supplied
commonName = supplied

[req]
prompt=no
distinguished_name = my_distinguished_name
x509_extensions = my_extensions

[ my_distinguished_name ]
organizationName = example.com
commonName = yb-prod-tb-prod-yb

[ my_extensions ]
keyUsage = critical,digitalSignature,nonRepudiation,keyEncipherment,keyCertSign
basicConstraints = critical,CA:true,pathlen:1
EOF

index.txt ve serial.txt adında iki adet dosya aşağıdaki komut ile oluşturulur.

touch secure-data/index.txt
echo '01' > secure-data/serial.txt

Root CA için key üretilir.

openssl genrsa -out secure-data/ca.key

Oluşturulan key dosyasının yetkisi aşağıdaki komut ile değiştirilir.

chmod 755 secure-data/ca.key

Artık elimizde ca.conf ve ca.key dosyası mevcut sırada root sertifikasını oluşturmak kalıyor. Aşağıdaki komut ile root sertifikası oluşturulur.

openssl req -new \
            -x509 \
            -days 3650 \
            -config secure-data/ca.conf \
            -key secure-data/ca.key \
            -out secure-data/ca.crt

Bu aşamadan sonra secure-data dosyasının altında ca.crt ca.key ca.conf dosyaları bulunmalıdır. Sırada node sertifikalarının oluşturulması kalıyor.

1. Node İçin Sertifika Oluşturma (192.168.1.39)

İlk aşamada oluşturduğumuz secure-data/node.192.168.1.39 altına node.conf dosyası oluşturulur. Bu aşamada dikkat edilmesi gereken CommonName ve alt_names altında bulunan IP.1 parametrelerinin node ip adresinde olmasıdır.

cat > /home/yugabyte/secure-data/node.192.168.1.39/node.conf <<EOF

[ req ]
prompt=no
distinguished_name = my_distinguished_name
[ my_distinguished_name ]
organizationName = Yugabyte
# Required value for commonName, do not change
commonName = 192.168.1.39
# Multiple subject alternative names (SANs) such as IP Address,
# DNS Name, Email, URI, and so on, can be specified under this section
[ req_ext]
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.1.39
EOF

Node için key dosyası üretilir ve dosya yetkisi verilir.

openssl genrsa -out secure-data/node.192.168.1.39/node.192.168.1.39.key
chmod 755 secure-data/node.192.168.1.39/node.192.168.1.39.key

Node sertifikalarının oluşturulması için Certificate Signing Request dosyasının oluşturulması gerekmektedir. Bu request dosyası ile beraber sertifika oluşmaktadır. Bu dosya aşağıdaki komut ile oluşturulur.

openssl req -new \
            -config secure-data/node.192.168.1.39/node.conf \
            -key secure-data/node.192.168.1.39/node.192.168.1.39.key \
            -out secure-data/node.192.168.1.39/node.csr

Oluşturulan Root CA dosyaları ve konfigürasyon dosyaları node sertifikası aşağıdaki komut ile oluşturulur. Bu sayede SelfSinged olarak ilk aşamada oluşturduğumuz kök sertifikası ile node sertifikasını imzalamış oluyoruz.

openssl ca -config secure-data/ca.conf \
           -keyfile secure-data/ca.key \
           -cert secure-data/ca.crt \
           -policy my_policy \
           -out secure-data/node.192.168.1.39/node.192.168.1.39.crt \
           -outdir secure-data/node.192.168.1.39/ \
           -in secure-data/node.192.168.1.39/node.csr \
           -days 3650 \
           -batch \
           -extfile secure-data/node.192.168.1.39/node.conf \
           -extensions req_ext

Komut hatasız çalıştığında aşağıdaki çıktıya benzer bir çıktı elde edilmesi gerekmektedir.

Using configuration from secure-data/ca.conf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
organizationName      :ASN.1 12:'Yugabyte'
commonName            :ASN.1 12:'192.168.1.39'
Certificate is to be certified until Feb 11 04:53:11 2030 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

2. Node İçin Sertifika Oluşturma (192.168.1.40)

İlk aşamada oluşturduğumuz secure-data/node.192.168.1.40 altına node.conf dosyası oluşturulur. Bu aşamada dikkat edilmesi gereken CommonName ve alt_names altında bulunan IP.1 parametrelerinin node ip adresinde olmasıdır.

cat > /home/yugabyte/secure-data/node.192.168.1.40/node.conf <<EOF

[ req ]
prompt=no
distinguished_name = my_distinguished_name
[ my_distinguished_name ]
organizationName = Yugabyte
# Required value for commonName, do not change
commonName = 192.168.1.40
# Multiple subject alternative names (SANs) such as IP Address,
# DNS Name, Email, URI, and so on, can be specified under this section
[ req_ext]
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.1.40
EOF

Node için key dosyası üretilir ve dosya yetkisi verilir.

openssl genrsa -out secure-data/node.192.168.1.40/node.192.168.1.40.key
chmod 755 secure-data/node.192.168.1.40/node.192.168.1.40.key

Node sertifikalarının oluşturulması için Certificate Signing Request dosyasının oluşturulması gerekmektedir. Bu request dosyası ile beraber sertifika oluşmaktadır. Bu dosya aşağıdaki komut ile oluşturulur.

openssl req -new \
            -config secure-data/node.192.168.1.40/node.conf \
            -key secure-data/node.192.168.1.40/node.192.168.1.40.key \
            -out secure-data/node.192.168.1.40/node.csr

Oluşturulan Root CA dosyaları ve konfigürasyon dosyaları node sertifikası aşağıdaki komut ile oluşturulur. Bu sayede SelfSinged olarak ilk aşamada oluşturduğumuz kök sertifikası ile node sertifikasını imzalamış oluyoruz.

openssl ca -config secure-data/ca.conf \
           -keyfile secure-data/ca.key \
           -cert secure-data/ca.crt \
           -policy my_policy \
           -out secure-data/node.192.168.1.40/node.192.168.1.40.crt \
           -outdir secure-data/node.192.168.1.40/ \
           -in secure-data/node.192.168.1.40/node.csr \
           -days 3650 \
           -batch \
           -extfile secure-data/node.192.168.1.40/node.conf \
           -extensions req_ext

Komut hatasız çalıştığında aşağıdaki çıktıya benzer bir çıktı elde edilmesi gerekmektedir.

Using configuration from secure-data/ca.conf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
organizationName      :ASN.1 12:'Yugabyte'
commonName            :ASN.1 12:'192.168.1.40'
Certificate is to be certified until Feb 11 04:53:11 2030 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

3. Node İçin Sertifika Oluşturma (192.168.1.41)

İlk aşamada oluşturduğumuz secure-data/node.192.168.1.41altına node.conf dosyası oluşturulur. Bu aşamada dikkat edilmesi gereken CommonName ve alt_names altında bulunan IP.1 parametrelerinin node ip adresinde olmasıdır.

cat > /home/yugabyte/secure-data/node.192.168.1.41/node.conf <<EOF

[ req ]
prompt=no
distinguished_name = my_distinguished_name
[ my_distinguished_name ]
organizationName = Yugabyte
# Required value for commonName, do not change
commonName = 192.168.1.41
# Multiple subject alternative names (SANs) such as IP Address,
# DNS Name, Email, URI, and so on, can be specified under this section
[ req_ext]
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.1.41
EOF

Node için key dosyası üretilir ve dosya yetkisi verilir.

openssl genrsa -out secure-data/node.192.168.1.41/node.192.168.1.41.key
chmod 755 secure-data/node.192.168.1.41/node.192.168.1.41.key

Node sertifikalarının oluşturulması için Certificate Signing Request dosyasının oluşturulması gerekmektedir. Bu request dosyası ile beraber sertifika oluşmaktadır. Bu dosya aşağıdaki komut ile oluşturulur.

openssl req -new \
            -config secure-data/node.192.168.1.41/node.conf \
            -key secure-data/node.192.168.1.41/node.192.168.1.41.key \
            -out secure-data/node.192.168.1.41/node.csr

Oluşturulan Root CA dosyaları ve konfigürasyon dosyaları node sertifikası aşağıdaki komut ile oluşturulur. Bu sayede SelfSinged olarak ilk aşamada oluşturduğumuz kök sertifikası ile node sertifikasını imzalamış oluyoruz.

openssl ca -config secure-data/ca.conf \
           -keyfile secure-data/ca.key \
           -cert secure-data/ca.crt \
           -policy my_policy \
           -out secure-data/node.192.168.1.41/node.192.168.1.41.crt \
           -outdir secure-data/node.192.168.1.41/ \
           -in secure-data/node.192.168.1.41/node.csr \
           -days 3650 \
           -batch \
           -extfile secure-data/node.192.168.1.41/node.conf \
           -extensions req_ext

Komut hatasız çalıştığında aşağıdaki çıktıya benzer bir çıktı elde edilmesi gerekmektedir.

Using configuration from secure-data/ca.conf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
organizationName      :ASN.1 12:'Yugabyte'
commonName            :ASN.1 12:'192.168.1.41'
Certificate is to be certified until Feb 11 04:53:11 2030 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

Sertifika oluşturma işlemini başarılı bir şekilde yaptık sırada bu sertifikaları sunuculara kopyalama kalıyor. Aşağıdaki komut ile ilgili dosyaları sunuculara kopyalayabiliriz.

scp secure-data/ca.crt 192.168.1.39:/home/yugabyte/yugabyte-tls-config
scp -R secure-data/node.192.168.1.39/*.crt 192.168.1.39:/home/yugabyte/yugabyte-tls-config
scp -R secure-data/node.192.168.1.39/*.key 192.168.1.39:/home/yugabyte/yugabyte-tls-config

scp secure-data/ca.crt 192.168.1.40:/home/yugabyte/yugabyte-tls-config
scp -R secure-data/node.192.168.1.40/*.crt 192.168.1.40:/home/yugabyte/yugabyte-tls-config
scp -R secure-data/node.192.168.1.40/*.key 192.168.1.40:/home/yugabyte/yugabyte-tls-config

scp secure-data/ca.crt 192.168.1.41:/home/yugabyte/yugabyte-tls-config
scp -R secure-data/node.192.168.1.41/*.crt 192.168.1.41:/home/yugabyte/yugabyte-tls-config
scp -R secure-data/node.192.168.1.41/*.key 192.168.1.41:/home/yugabyte/yugabyte-tls-config

YugabyteDB Cluster Kurulumu

Yugabyte home directory’sine gidilir ve ardından kurulum dosyaları indirilir. Bu işlemler TÜM NODE’larda yapılmalıdır.

cd /home/yugabyte
wget https://downloads.yugabyte.com/releases/2.23.0.0/yugabyte-2.23.0.0-b710-linux-x86_64.tar.gz

İndirilen dosya açılır. Kurulum öncesi hazırlıklar için post_install.sh dosyası çalıştırılır.

tar xvf yugabyte-2.23.0.0-b710-linux-x86_64.tar.gz
cd yugabyte-2.23.0.0 && ./post_install.sh

Cluster Olusturma

Cluster oluşturmadan önce bazı ortam değişkenlerinin ayarlanması gerekmektedir. Bu ortam değişkenleri aşağıdaki komutlar ile ayarlanabilir. Buradaki işlemler her bir node üzerinde teker teker yapılmalıdır.

export IP=$(hostname -I |awk '{print $1}')
export MASTERS=192.168.1.39:7100,192.168.1.40:7100,192.168.1.41:7100
export DATA_DIR_MASTER=/mnt/yugabytedb
export DATA_DIR_TSERVER=/mnt/yugabytedb/tserver

Ardından master node’u başlatalım. Bu komut her bir master’da teker teker yapılmalıdır.

./bin/yb-master --master_addresses=$MASTERS \
 --fs_data_dirs=$DATA_DIR_MASTER \
 --rpc-bind-addresses=$IP:7100 \
 --replication_factor=3 \
 --webserver_interface=$IP \
 --use_node_to_node_encryption=yes \
 --allow_insecure_connections=false \
 --certs_dir=/home/yugabyte/yugabyte-tls-config >& /home/yugabyte/yb-masters.out &

Sorunsuz başladıktan sonra aşağıdaki komut ile tablet server’lar başlatılır.

./bin/yb-tserver --tserver_master_addrs=$MASTERS \
 --fs_data_dirs=$DATA_DIR_TSERVER \
 --rpc-bind-addresses=$IP:9100 \ 
 --cql_proxy_bind_address=$IP:9042 \
 --redis_proxy_bind_address=$IP:6379 \
 --webserver_interface=$IP \
 --use_node_to_node_encryption=yes \
 --allow_insecure_connections=false \
 --certs_dir=/home/yugabyte/yugabyte-tls-config >& /home/yugabyte/yb-tserver.out &

Arayüzüne aşağıdaki adresten ulaşılabilmektedir.

http://192.168.1.39:7000

Master node’u reboot ettiğimizde Leader’ın değiştiğini test edelim.

Görüldüğü gibi leader sunucu 192.168.1.41 IP adresli sunucuya geçti.

TLS Durumunu Aşağıdaki sayfadan görüntüleyebiliriz.

  • Node to node encryption enabled: true
  • Client to server encryption enabled: false
  • Allow insecure connections: off
  • SSL Protocols: default – TLS only
  • Cipher list: default
  • Ciphersuites: default

Sertifika Detaylarına baktığımızda;

Node certificate details: 
  Issuer: /O=example.com/CN=yb-prod-tb-prod-yb
  Serial Number: 1
  Validity:
    Not Before: Nov 10 16:42:18 2024 GMT
    Not After: Nov  8 16:42:18 2034 GMT
  Subject: /O=Yugabyte/CN=192.168.1.39

Tebrikler artık Node to Node encripytion’a sahip dağıtık mimaride bir SQL veritabanı clusterına sahip oldunuz!