Използване на amazon RDS с WordPress през SSL

Мигрирам нашата база данни на WordPress към RDS, която се използва и от други услуги в нашата инфраструктура. Но не можах да намеря никаква опция за конфигуриране за wp-config.php, където бих могъл да посоча този SSL да се използва при свързване към сървъра. Това също ще изисква препратка към файла на сертифициращия орган предоставено от Amazon. Сървърът на приложения, на който в момента работи WordPress, е извън AWS клъстера.

Отговорите, които можах да намеря, бяха доста стари (тук използвам WordPress 4.2) и не дават много насоки.

Как мога да конфигурирам WordPress да използва Amazon RDS през SSL връзка (като посоча публичния ключ)?


person Jai Pandya    schedule 24.04.2015    source източник


Отговори (2)


Имах същия въпрос. За щастие някои други хора предложиха разумно решение тук: https://core.trac.wordpress.org/ticket/28625. От край до край, ето какво направих, за да накарам SSL да работи:

1. Добавете следното към файла wordpress wp-includes/wp-db.php. (с изключение на последните 2 реда, които са само за препратка към точката на вмъкване)

//ADDED per https://core.trac.wordpress.org/ticket/28625
// call set_ssl if mysql client flag set and settings available
if ( $client_flags & MYSQL_CLIENT_SSL ) {
    $pack = array( $this->dbh );
    $call_set = false;
    foreach( array( 'MYSQL_SSL_KEY', 'MYSQL_SSL_CERT', 'MYSQL_SSL_CA',
        'MYSQL_SSL_CAPATH', 'MYSQL_SSL_CIPHER' ) as $opt_key ) {
        $pack[] = ( defined( $opt_key ) ) ? constant( $opt_key ) : null;
        $call_set |= defined( $opt_key );
    }
    /* Now if anything was packed - unpack into the function.
    * Note this doesn't check if paths exist, as per the PHP doc
    * at http://www.php.net/manual/en/mysqli.ssl-set.php: "This
    * function always returns TRUE value. If SSL setup is incorrect
    * mysqli_real_connect() will return an error ..."
    */
    if ( $call_set ) { // SSL added here!
        call_user_func_array( 'mysqli_ssl_set', $pack );
    }
}//END ADD - below is the point above which to insert this

if ( WP_DEBUG ) {
    mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );

2. Персонализирайте вашия файл wordpress wp-config.php.

Добавете и персонализирайте следните редове във вашия файл wp-config.php. Можете да ги тествате от разработка/постановка, както и от производство, ако имате множество среди.

define('DB_HOST', 'rds-yourserver-abcdefghi9j.us-west-1.rds.amazonaws.com');
define('MYSQL_CLIENT_FLAGS', MYSQL_CLIENT_SSL);//This activates SSL mode
define('MYSQL_SSL_CA', '/file/path/to/your/aws/rds-combined-ca-bundle.pem');

Имайте предвид, че има 5 налични MYSQL_SSL* настройки, които можете да използвате във вашата конфигурация, за код в #1 по-горе. Моята RDS връзка работи чрез SSL само с опцията _CA.

3. Тест за надеждност дали връзката ви е криптирана.

Добавете бърз тестов файл, за да покажете дали текущата връзка с Wordpress използва SSL или не. Създайте примерен файл като този, наречен test.php, и го поставете в корена на wordpress или някъде, достъпен в мрежата. Не забравяйте да премахнете този файл, когато приключите с тестването.

<?php
require( dirname( __FILE__ ) . '/wp-blog-header.php' ); //EDIT THIS PATH SO IT IS CORRECT FOR YOUR test.php file relative to the wp-blog-header.php file
global $wpdb;
$row = $wpdb->get_row( "SHOW STATUS LIKE 'Ssl_cipher'" );
var_dump($row);

/*
If you are connected over SSL this should output something like:
object(stdClass)#116 (2) { ["Variable_name"]=> string(10) "Ssl_cipher" ["Value"]=> string(10) "AES256-SHA" }

If you are NOT connected over SSL this should output something like:
object(stdClass)#116 (2) { ["Variable_name"]=> string(10) "Ssl_cipher" ["Value"]=> string(10) "" }

*/
?>

4. Разположете и тествайте вашата връзка

Разположете вашите промени и файла test.php във вашата инсталация на wordpress и рестартирайте вашия уеб сървър, ако е необходимо. Използвам apache, така че стартирам

sudo apachectl restart
person randalv    schedule 01.05.2015
comment
Това работи перфектно на Microsoft Azure, свързвайки се с Amazon RDS като алтернатива на ClearDB. - person uniquelau; 09.03.2016
comment
Константата MYSQL_CLIENT_SSL ли е или MYSQLI_CLIENT_SSL? Мисля, че MYSQLI_CLIENT_SSL работи за мен. - person xpander001; 16.11.2017
comment
@xpander001 Преди 2,5 години, когато публикувах, нямаше I в името на променливата, но съм виждал други онлайн препратки, които споменават I, така че вероятно е по-нова версия. - person randalv; 17.11.2017

За всеки, който използва Redhat 7 + Apache 2.4 + PHP 7. Бях изправен пред същия проблем, така че добавих под два реда в wp-config.php, както беше споменато по-горе.

define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL | MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT); // имате нужда от това за PHP 7 define('MYSQL_SSL_CA', '/var/www/BaltimoreCyberTrustRoot.crt.pem');

Въпреки това все още не успя да се свърже с DB...

Така се обади един човек и той ме помоли да деактивирам Selinux, като изпълня следната команда:

setsebool -P httpd_can_network_connect_db 1

Казах, пич, вече деактивирах SELinux защо трябва да стартирам това отново? Той ми изкрещя: НЕ ЗНАМ, ПУСКАЙТЕ ГО!

така че направих и рестартирах httpd, и той работи без промяна на wp-db.php... не ме питайте защо, тъй като нямам никаква представа за логиката зад това.

person star    schedule 31.07.2018