RoundCube - Plugins 「Password」 비밀번호 변경 적용 [feat. MariaDB]

    ◆ Plugins

    플러그인「Plugin」은 프로그램 또는 소프트웨어등 기존에 없는 기능을 더욱 확장하고 사용자 편의성을 높이기 위한 환경을 제공합니다. 지금 티스토리 에디터에서 글을 작성할 때 더 보기에 있는 「코드블럭」이나 「이전 발행 글 넣기」도 플러그인에 해당됩니다. 오픈소스인 RoundCube에도 사용자 편의성을 위한 웹메일 플러그인을 다양하게 제공하고 있습니다. 그중 사용자가 직접 패스워드를 변경할 수 있도록 만들어주는 「Password」 플러그인이 있습니다. 그냥 적용한다고 해서 바로 되는 게 아닌 사용자 구성에 맞게 커스텀이 필요하므로 이에 대해서 알아보도록 하겠습니다. 필자가 구축한 방식으로 진행하셨다면 기본 설치된 플러그인은 「Filesystem_attachments」, 「jqueryui」, 「virtuser_query」 3개가 기본으로 적용되어 있습니다.

    ■ 설치환경 및 준비물

    메일서버 구축[참고] : https://foxydog.tistory.com/104

    릴리즈 업데이트 및 설치 테스트 : 「2024-05 ~ 2024-06」

    개인적으로 사용하고 있는 클라우드서버에 이전에 블로그에 남긴 구축 방식으로 업데이트「update」를 진행하여 일부 프로그램 및 솔루션이 업데이트가 된 상태에서 진행했습니다. 「Rocky Linux release 8.9 (Green Obsidian)」, 「Apache/2.4.37 (Rocky Linux)」, 「PHP 7.4.33」, 「10.6.18-MariaDB」, 대체로 마이너버전만 업데이트되었으며, 라운드큐브는 최신 버전인 「Version 1.6.7」으로 변경하였습니다.

     

    「~/roundcube/plugins」 경로에 이미 현재 버전에서 안정적으로 사용할 수 있는 플러그인들이 설치가 되어 있습니다. 그 외 플러그인 설치를 하실 경우는 아래 공식 홈페이지 Plugins 설치 방법 참고

    URL : https://plugins.roundcube.net/#/


    ① PASSWORD 플러그인 활성화 하기

    [root@mail~]# vim /var/www/html/roundcube/config/config.inc.php    [설정 파일 열기]

    ※ DocumentRoot 본인 RoundCube 설치 경로 ~/roundcube/config/config.inc.php

     

    ◈ PHP 코드중

    // ----------------------------------
    // PLUGINS
    // ----------------------------------
    // List of active plugins (in plugins/ directory)
    $config['plugins'] = array('virtuser_query', 'password');    [추가]

    ※ 해당 설정 라인에 「password」 플러그인 추가 / 구분자 쉼표 콤마 「 , 」와 양쪽 따옴표 「 ' ' 」 사용으로 문법에 문제만 없다면 띄어쓰기는 문제없습니다.


    ② PASSWORD 플러그인 환경 설정 파일 복사 및 구성

    [root@mail ~]# cd /var/www/html/roundcube/plugins/password/    [경로 이동]

     

    [root@mail password]# cp -arp config.inc.php.dist config.inc.php    [샘플 파일 복사]

    ※ config.inc.php.dist  「환경 설정 샘플 파일」

     

    [root@mail password]# vim config.inc.php    [환경 설정 열기]

    ※ 필자는 사용자의 패스워드를 DB에 저장하므로 환경 설정에서 「SQL 드라이버 옵션」「비밀번호를 변경하는 데 사용되는 SQL 쿼리」이 2가지만 수정 또는 추가를 해주시면 됩니다.

    ◈ PHP 코드 중

    107 // SQL Driver options

    108 // ------------------

    109 // PEAR database DSN for performing the query. By default

    110 // Roundcube DB settings are used.

    111 // Supported replacement variables:

    112 // %h - user's IMAP hostname

    113 // %n - hostname ($_SERVER['SERVER_NAME'])

    114 // %t - hostname without the first part

    115 // %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part)

    116 // %z - IMAP domain (IMAP hostname without the first part)

    117 //$config['password_db_dsn'] = '';    [※ 주석 처리 후, 아래 예시 참고]

     

    「 $config['password_db_dsn'] = 'mysql://username:password@localhost/database'; 」

     

    118 $config['password_db_dsn'] = 'mysql://foxydog:test1234@localhost/postfix_accounts';

     

    ※ 즉, 본인이 사용자의 패스워드를 저장한 정보 경로를 잡아주시면 됩니다. 현재 사용하는 암호를 비교 및 새로운 암호로 변경하기 위해 사용

     

    120 // The SQL query used to change the password.
    121 // The query can contain the following macros that will be expanded as follows:
    122 //      %p is replaced with the plaintext new password
    123 //      %P is replaced with the crypted/hashed new password
    124 //        according to configured password_algorithm
    125 //      %o is replaced with the old (current) password
    126 //      %O is replaced with the crypted/hashed old (current) password
    127 //        according to configured password_algorithm
    128 //      %h is replaced with the imap host (from the session info)
    129 //      %u is replaced with the username (from the session info)
    130 //      %l is replaced with the local part of the username
    131 //         (in case the username is an email address)
    132 //      %d is replaced with the domain part of the username
    133 //         (in case the username is an email address)
    134 // Escaping of macros is handled by this module.
    135 // Default: "SELECT update_passwd(%P, %u)"
    136 //$config['password_query'] = 'SELECT update_passwd(%P, %u)';    [※ 주석 처리 후, 아래 예시 참고]

     

    「 $config['password_query'] = "UPDATE password(table) SET password(column)=ENCRYPT(%p, CONCAT('option', SUBSTRING(SHA(RAND()), -16))) where Email_user(column)=%u" 」

     

    137 $config['password_query'] = "update accounts_table set password=ENCRYPT(%p, CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))) where Email=%u";

     

    ※ 패스워드 칼럼은 관리자마다 다르게 설정할 수 있습니다. ENCRYPT 「단방향 hash 알고리즘 방식으로 SHA-2 중 가장 강력한 SHA-512 해시 함수」입니다. 평문에서 암호화하므로 「 %p 」 소문자로 사용해야 합니다. 메일서비스 특성상 패스워드는 한번 암호화되면 복고화 불가능한 방식으로 하는 게 좋습니다. 양쪽 쌍 따옴표 「 " " 」로 하나의 쿼리로 인식하므로 문법 주의합니다. CONCAT('「$6$」' 부분은 임의값으로 하면 됩니다. 추출된 16자를 (option) 해당 값과 결합하여 랜덤으로 패스워드를 만드는 부분, 단 처음 관리자가 패스워드를 할당해 주셨을 때와 같은 문자열로 세팅할 것

     

    ◈ 추가 내용

    RoundCube 로그인을 할 때 Dovecot 「IMAP」 연동 방식을 사용하여 「virtuser_query」 플러그인을 통해 사용자 테이블을 조회하여 로그인을 처리합니다. 그래서 Dovecot 사용자 인증을 위해 먼저 SQL 데이터베이스를 설정한 파일이 있는 것을 기억할 겁니다.

    [root@localhost ~]# vim /etc/dovecot/dovecot-sql.conf.ext

     

    driver = mysql

    connect = "host=127.0.0.1 dbname=postfix_accounts user=foxydog password=test1234"

    default_pass_scheme = SHA512-CRYPT

    password_query = SELECT Email as User, password FROM accounts_table WHERE Email='%u';

    위 구성과 똑같이 맞춰주면 됩니다. 본인이 원하는 암호화 알고리즘으로 설정해 주시면 됩니다. 만약 「%p」 암호화 알고리즘을 「MD5」 「SHA256」등으로 했다면 「default_pass_scheme」 부분을 동일하게 똑같은 알고리즘명으로 변경해 주면 됩니다.

     


    ③ 암호 변경 테스트


    ④ 일부 옵션 설명「config.inc.php」

    # 설치경로/roundcube/plugins/password/config.inc.php

    옵션 설명
    ◈ $config['password_confirm_current'] = true;
    // Default: false
    ◇ 새로운 암호를 설정하기 위해서 현재의 암호를 확인 합니다.
    대부분의 메일 솔루션은 보안을 위해 사용
    true = 사용」
    false = 사용안함, 또는 //주석 처리」
    ◈ $config['password_minimum_length'] = 8;

    $config['password_minimum_length'] = '';
    ※ 모든 길이 허용 시
    ◇ 비밀번호 최소 길이 설정
    8」로 설정 되어 있을 경우 「최소 8자 이상」 권고

    ◇ 모든 길이 허용은 보안에 취약하므로 사용할일은 없을 것 같네요. 공백시 0이 아닌 따옴표 「''」로 처리 할 것
    $config['password_minimum_score'] = 2;
    // Default: 0
    ◇ 패스워드 강도 설정
    0」 사용안함
    1」 영문 또는 숫자만 사용 가능
    2~이상부터는 최소 숫자 및 특수문자 각각 한개 이상 포함
    「5」 최대 강도
    $config['password_log'] = true; ◇ 비밀번호 변경에 대한 로그 기록 활성화
    true = 사용」
    false = 사용안함」
    로그 경로 : ~/roundcube/logs/password.log
    로그 예시 : [시간] Password changed for user [메일주소] (ID: 1) from IP[111.xxx.xxx.xxx]

     

    다양한 옵션이 많이 있지만 일반 사용자가 설정할만한 옵션은 위 5~6개 밖에 없네요. RoundCube랑 연동이 되어 있기 때문에 모르는 옵션을 잘 못 건드리면 웹메일 에러가 발생할 수 있으니 주의해 주시기 바랍니다.


    최근 라운드큐브 플러그인에 대해서 적용 및 연구를 해보고 있습니다. 개발자는 아니다 보니 많은 시행착오를 겪긴 하지만 이미 만들어져 있는 플러그인을 건드리는 거다 보니 조금만 노력하면 어떻게든 적용을 하긴 하네요. 용량 체크하는 Quota 플러그인은 최신 버전인 Elastic 스킨에서는 현재 개발된 게 없는 것 같습니다. 「jfcherng-roundcube/quota」 개발자가 만든 플러그인이 있지만 Larry 스킨 버전에 맞춰져 있다 보니 최신버전에서 적용하면 메뉴는 나오지만 결과값이 제대로 안 나옵니다. 하여튼 시간 나는 대로 플러그인에 대해서 계속 알아보도록 하겠습니다.

     

    ※ 모든 내용은 직접 테스트 및 확인한 내용만 업로드합니다. 오타나 잘못된 정보가 포함되어 있다면 지적 및 정보 공유 감사합니다.

    Designed by JB FACTORY