SSL Pada MySQL

basit.adhi.prabowo
basit.adhi.prabowo

Persiapan

  1. Buat sertifikat jika belum ada. Untuk beberapa distribusi sudah tersedia sertifikat. Untuk ubuntu, sertifikat ada di folder /var/lib/mysql
  2. Salin ca.pem, client-key.pem dan client-cert.pem ke server aplikasi (jika server aplikasi tidak menjadi satu dengan server MySQL). Agar seragam, salin ke /etc/ssl/mysql untuk Linux, sedangkan C:\ssl\mysql untuk Windows
    1. Jika server aplikasi terpisah dengan MySQL (Linux)
      userserveraplikasi@server-aplikasi:/# sudo mkdir /etc/ssl/mysql

      userserveraplikasi@server-aplikasi:/# sudo scp userserverbasisdata@alamatserverbasisdata:/var/lib/mysql/ca.pem /etc/ssl/mysql/ca.pem
      userserveraplikasi@server-aplikasi:/# sudo scp userserverbasisdata@alamatserverbasisdata:/var/lib/mysql/client-key.pem /etc/ssl/mysql/client-key.pem
      userserveraplikasi@server-aplikasi:/# sudo scp userserverbasisdata@alamatserverbasisdata:/var/lib/mysql/client-cert.pem /etc/ssl/mysql/client-cert.pem
    2. Jika server aplikasi menjadi satu dengan MySQL (Linux)
      userserveraplikasi@server-aplikasi:/# sudo mkdir /etc/ssl/mysql
      userserveraplikasi@server-aplikasi:/# sudo cp /var/lib/mysql/ca.pem /etc/ssl/mysql/ca.pem
      userserveraplikasi@server-aplikasi:/# sudo cp /var/lib/mysql/client-key.pem /etc/ssl/mysql/client-key.pem
      userserveraplikasi@server-aplikasi:/# sudo cp /var/lib/mysql/client-cert.pem /etc/ssl/mysql/client-cert.pem
    3. Windows
      C:\Users\server-aplikasi>mkdir C:\ssl\mysql
      Salin ketiga berkas ke folder C:\ssl\mysql
  3. Untuk beberapa server aplikasi perlu di ekspor sertifikatnya ke bentuk lain, misalnya untuk java. Untuk yang tidak perlu ekspor, maka tidak perlu melakukan langkah ini.
    Catatan:
    Untuk perintah openssl harus menginstal openssl terlebih dahulu. Untuk perintah keytool harus menginstal java terlebih dahulu.

    1. Siapkan nama, alias dan password store, misalnya: keystore sebagai namanya, storeMySQL sebagai alias dan katakuncistore sebagai passwordnya. Masukkan kata kunci tersebut jika ditanyakan pada saat menggunakan keytool dan digunakan pada saat mengakses sertifikat yang sudah diekspor tersebut.
    2. Pada server MySQL
      userserverbasisdata@server-basisdata:/# cd /var/lib/mysql
      userserverbasisdata@server-basisdata:/var/lib/mysql#
      openssl pkcs12 -export -inkey client-key.pem -in client-cert.pem -out client.packet -passout pass:
      katakuncistore 
    3. Kemudian ubah ke dalam Keystore Java
      Catatan: JKS adalah format proprietary, sedangkan PKCS12 adalah format standar industri

      1. Jika server aplikasi terpisah dengan MySQL (Linux)
        userserveraplikasi@server-aplikasi:/# sudo scp userserverbasisdata@alamatserverbasisdata:/var/lib/mysql/client.packet /etc/ssl/mysql/client.packet
        userserveraplikasi@server-aplikasi:/# sudo scp userserverbasisdata@alamatserverbasisdata:/var/lib/mysql/ca.pem /etc/ssl/mysql/ca.pem
        userserveraplikasi@server-aplikasi:/# cd /etc/ssl/mysql

        userserveraplikasi@server-aplikasi:/etc/ssl/mysql# keytool -importkeystore -srckeystore client.packet -srcstoretype pkcs12 -srcstorepass katakuncistore -destkeystore keystore.clientcert -deststoretype pkcs12 -storepass katakuncistore
        userserveraplikasi@server-aplikasi:/etc/ssl/mysql# keytool -importcert -alias storeMySQL -file ca.pem -keystore keystore.trustcert -storetype pkcs12 -storepass katakuncistore 
      2. Jika server aplikasi menjadi satu dengan MySQL (Linux)
        userserveraplikasi@server-aplikasi:/# sudo cp /var/lib/mysql/client.packet /etc/ssl/mysql/client.packet
        userserveraplikasi@server-aplikasi:/# sudo cp /var/lib/mysql/ca.pem /etc/ssl/mysql/ca.pem
        userserveraplikasi@server-aplikasi:/# cd /etc/ssl/mysql
        userserveraplikasi@server-aplikasi:/etc/ssl/mysql# keytool -importkeystore -srckeystore client.packet -srcstoretype pkcs12 -srcstorepass katakuncistore -destkeystore keystore.clientcert -deststoretype pkcs12 -storepass katakuncistore
        userserveraplikasi@server-aplikasi:/etc/ssl/mysql# keytool -importcert -alias storeMySQL -file ca.pem -keystore keystore.trustcert -storetype pkcs12 -storepass katakuncistore 
      3. Pada server aplikasi (Windows)
        Salin berkas client.packet dan ca.pem ke folder C:\ssl\mysql
        C:\Users\server-aplikasi>cd C:\ssl\mysql
        C:\ssl\mysql>“C:\Program Files\Java\jdkx.x.x_xx\bin\keytool.exe” -importkeystore -srckeystore client.packet -srcstoretype pkcs12 -srcstorepass katakuncistore -destkeystore keystore.clientcert -deststoretype pkcs12 -storepass katakuncistore
        C:\ssl\mysql>“C:\Program Files\Java\jdkx.x.x_xx\bin\keytool.exe”
        keytool -importcert -alias storeMySQL -file ca.pem -keystore keystore.trustcert -storetype pkcs12 -storepass katakuncistore

Penggunaan (Menggunakan Kunci Khusus)

  1. Aplikasi MySQL, seperti: MySQL Workbench
    1. Klik kanan pada koneksi yang hendak dibuat aman, kemudian pilih Edit Connection.

      edit koneksi
      edit koneksi
    2. Pilih Tab Connection > SSL, kemudian pilih Require pada Use SSL, dan isi SSL File dengan 3 berkas sertifikat yang ada.

      set berkas
      set berkas
  2. PHP
    1. Prosedural (sumber: https://stackoverflow.com/questions/9738712/connect-to-remote-mysql-server-with-ssl-from-php, terakhir diakses 3 Jan 2020)
      $db = mysqli_init();

      mysqli_options ($db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);
      ssl_set($db, ‘/etc/mysql/ssl/client-key.pem’, ‘/etc/mysql/ssl/client-cert.pem’, ‘/etc/mysql/ssl/ca-cert.pem’, NULL, NULL);
      $conn = mysqli_real_connect ($db, $servername, $username, $password, $dbname, 3306, NULL, MYSQLI_CLIENT_SSL);
      if (!$conn)
      {
      die(‘CONNERR’);
      }
    2. Objek (transformasi prosedural menjadi objek dari kode di atas)
      $conn = new mysqli($servername, $username, $password);
      $conn->init();
      $conn->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);
      $conn->ssl_set(‘/etc/mysql/ssl/client-key.pem’, ‘/etc/mysql/ssl/client-cert.pem’, ‘/etc/mysql/ssl/ca-cert.pem’, NULL, NULL);
      $conn->real_connect($servername, $username, $password, $dbname, 3306, NULL, MYSQLI_CLIENT_SSL);
      if ($conn->connect_errno > 0 || $conn->connect_error)
      {
      die(‘CONNERR’);
      }
  3. Code Igniter (sumber: https://codeigniter.com/user_guide/database/configuration.html, terakhir diakses 3 Jan 2020)
    1. Buka config\database.php
    2. Setting driver dengan MySQLi
      $db[‘default’][‘dbdriver’] = “mysqli”;
    3. Setting security
      $db[‘default’][‘security’] = [“ssl_key” => “/etc/ssl/mysql/client-key.pem”, “ssl_cert” => “/etc/ssl/mysql/client-cert.pem”, “ssl_ca” => “/etc/ssl/mysql/ca.pem”];
  4. WordPress
    1. Tambahkan (https://serverfault.com/questions/778393/enabling-ssl-connection-from-wordpress-to-mysql, terakhir diakses 4 Jan 2020)
      define(‘MYSQL_CLIENT_FLAGS’, MYSQLI_CLIENT_SSL);
      pada wp-config.php
    2. Jika ingin menggunakan kunci khusus
      1. Install Plugin Secure DB Connection (By Xiao Yu) (https://wordpress.org/plugins/secure-db-connection/, terakhir diakses 4 Jan 2020)
      2. Ada 5 opsi yang bisa disetting, yang sama dengan opsi yang ada di ssl_set(), yaitu MYSQL_SSL_KEY, MYSQL_SSL_CERT, MYSQL_SSL_CA, MYSQL_SSL_CA_PATH, dan MYSQL_SSL_CIPHER. Tambahkan pada wp-config.php.
        contoh:
        //plugin secure db connection
        define(‘MYSQL_SSL_KEY’, ‘/etc/mysql/ssl/client-key.pem’);
        define(‘MYSQL_SSL_CERT’, ‘/etc/mysql/ssl/client-cert.pem’);
        define(‘MYSQL_SSL_CA’, ‘/etc/mysql/ssl/ca-cert.pem’);
        //jangan lupa
        define(‘MYSQL_CLIENT_FLAGS’, MYSQLI_CLIENT_SSL);
        jika berhasil maka akan muncul keterangan MySQL Secured di At a Glance pada Dashboard

        MySQL Secured
        MySQL Secured
  5. Java / Tomcat (sumber: https://help.mulesoft.com/s/article/How-to-connect-to-MySQL-using-SSL, terakhir diakses 6 Jan 2020)
    1. Pastikan Keystore Java untuk sertifikat MySQL sudah ada melalui langkah sebelumnya di atas
    2. Tambahkan pada url JDBC useSSL, requireSSL, verifyServerCertificate, trustCertificateKeyStoreUrl, trustCertificateKeyStorePassword,clientCertificateKeyStoreUrl dan clientCertificateKeyStorePassword, misalnya:
      1. Linux
        <Resource auth=”Container” driverClassName=”com.mysql.jdbc.Driver” factory=”org.apache.tomcat.jdbc.pool.DataSourceFactory” type=”javax.sql.DataSource” url=”jdbc:mysql://alamatserverbasisdata:3306/namaskema?useSSL=true&amp;requireSSL=true&amp;verifyServerCertificate=true&amp;trustCertificateKeyStoreUrl=file:///etc/ssl/mysql/keystore.trustcert&amp;trustCertificateKeyStorePassword=katakuncistore&amp;clientCertificateKeyStoreUrl=file:///etc/ssl/mysql/keystore.clientcert&amp;clientCertificateKeyStorePassword=katakuncistore” />
      2. Windows
        <Resource auth=”Container” driverClassName=”com.mysql.jdbc.Driver” factory=”org.apache.tomcat.jdbc.pool.DataSourceFactory” type=”javax.sql.DataSource” url=”jdbc:mysql://alamatserverbasisdata:3306/namaskema?useSSL=true&amp;requireSSL=true&amp;verifyServerCertificate=true&amp;trustCertificateKeyStoreUrl=file:///C:\ssl\mysql\keystore.trustcert&amp;trustCertificateKeyStorePassword=katakuncistore&amp;clientCertificateKeyStoreUrl=file:///C:\ssl\mysql\keystore.clientcert&amp;clientCertificateKeyStorePassword=katakuncistore” />

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.