[카테고리:] 기술

  • Let’s Encrypt 와일드카드 인증서 발급하기

    Let’s Encrypt 와일드카드 인증서 발급하기

    1. Certbot 설치

    먼저 Certbot을 설치합니다.

    sudo apt-get update

    2. 인증서 생성
    2.1 생성 명령어 입력

    sudo certbot certonly –manual –preferred-challenges dns -d “*.mydomain.com” -d “mydomain.com”

    *mydomain.com만 주게 되면 domain으로 접속 시 SSL 인증서 적용이 되지 않습니다. -d 옵션을 한번 더 줘서 지정해줍니다.

    3. DNS TXT 레코드 타입 설정
    3.1 첫번째 TXT값 입력

    발급받은 인증서를 통해 SSL을 적용하고자 하는 도메인의 실소유자인지 인증하는 과정이 필요합니다.

    이렇게 발급한 값을,

    _acme-challenge를 서브 도메인으로 TXT레코드 타입으로해서 생성한 값을 집어넣습니다.

    DNS 설정 적용 버튼을 누른다고 바로 적용되지 않습니다. 한 1~2분 뒤쯤 시간이 지나고, enter를 눌러 다음으로 넘어가도록 합니다.

    TXT 레코드는 네임 서버 변경과 다르게, 전 세계에 전파되는데, 많은 시간을 필요로 하지 않습니다.

    3.2 두번째 TXT값 입력
    3.1을 진행하면, 또 값을 발급해달라고 요구합니다.

    TXT 레코드 설정 시 별도의 줄에 여러 값을 입력할 수 있습니다.

    Let’s encrypt 측은 TXT 레코드를 추가 후 삭제하지 말라고 하는데, 이미 소유자 인증을 마친 경우 추후 삭제해도 무방합니다.

    4. 발급받은 파일 조합

    이 화면이 뜬다면 정상적으로 SSL 인증서가 생성된 것입니다.

    발급받은 SSL 인증서 경로는 /etc/letsencrypt/live로 디렉토리를 이동하시면, 실제 파일을 확인해 볼 수 있습니다.

    이제 해당 경로의 인증서와 웹서버를 연결해줍니다.

  • mysql 설정 my.cnf

    [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    user=mysql
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    skip-external-locking # 외부(TCP/IP) 잠금비활성
    skip-name-resolve  # 필수. 대신 도메인 기준으로 사용 못한다.
    # wait_timeout=200  # 커넥션 종료후 언제까지 기다릴지 설정. 보통은 알아서 사라진다. 기본 28800 . sleep 이 너무 많을 경우 설정
    max_connections=200 # 최대 접속자수 시스템 필요량에 맞춰 설정

    table_open_cache=800 # 기본 64. 모든 쓰레드에서 오픈할 수 있는 테이블 수, ulimit 에서 open file 도 같이 수정 필요. 낮은 버전은 table_cache 라는 이름을 사용한다. ( max_connections * N )
    max_allowed_packet=16M # 적으면 긴 쿼리 날릴 때문제가 된다.16M 정도로 (설마 10MB이상으로 쿼리  날릴일 없겠지?)
    # max_connections * (sort_buffer_size+read_buffer_size) 만큼 메모리가 사용될 수 있다.

    sort_buffer_size=2M   # 소팅용 버퍼

    read_buffer_size=2M  # 데이터 읽기용 버퍼
    ft_min_word_len=2  # fultext 사용시 한글 사용할 경우, 2정도로 설정하라

    key_buffer_size=268435456 # 기본 8M이다. MyISAM 인덱스용. MyISAM 중심이라면 이 값을 많이 늘려라. 메모리 50% 이상도 생각해봐라.
    innodb_buffer_pool_size=4G  # 기본은 8M이다. 서버의 메모리에 맞춰서 설정 innoDB 중심이면 메모리의 80%까지 설정
    innodb_log_file_size=256M # 기본 5M이다.
    innodb_buffer_pool_size 의 10~25% 정도로 설정
    innodb_file_per_table=1  # 기본 0(off) 이다. 설정하면 테이블 단위로
    innoDB의 파일이 생긴다. (설정안하면 하나의 파일이 너무 커지니 설정하라)
    slow_query_log=1 #슬로우쿼리 사용 설정. 디스크 I/O가 많이 예상되거나 너무 긴 쿼리가 많을경우 off(0) 해라slow_query_log_file=/var/run/mysqld/mysqld-slow.log #슬로우쿼리 파일 위치
    long_query_time=2          # 슬로추 쿼리 기준 시간 2초 ~ 5초

    tmp_table_size=64M  # 기본값:16M. 디스크 임시 테이블 크기

    max_connect_error=10000  # 기본값: 10. 10000번 접속이 이상하면 접근 차단

    [mysqld_safe]
    log-error=/var/log/mysqld.log
    pid-file=/var/run/mysqld/mysqld.pid

  • Let’s encrypt 인증서 발급할 때 유의사항

    Let’s encrypt는 Apache2나 Nginx를 운영할 때 SSL 인증서를 무료로 발급해 주는 툴이다. 구글, 모질라 재단 등에서 후원하고 있는 프로젝트이기도 하다.

    Let’s encrypt는 리눅스 터미널에서 명령어를 사용해야 하는데, 인증서 발급 시 유의사항이 있다.

    Cleaning up challenges
    Problem binding to port 80: Could not bind to IPv4 or IPv6.

    80포트가 이미 사용 중이라서 certbot 명령어를 사용해 인증서를 발급 받을 수 없다고 출력이 되었다.

    이 경우 아파치나 엔진엑스가 실행 중이라면 위와 같은 문구가 출력될 수가 있는 것이다. 따라서 아파치나 엔진엑스를 죽여주면 된다.

    예: service apache2 stop (엔진 엑스를 사용중이라면 service nginx start)

    서버 엔진이 죽었다면, 다시 certbot 명령을 사용해서 인증서를 발급받으면 된다. 만약 인증서를 발급받았다면, 다시 서버엔진을 실행해 주어야 한다.

    예: service apche2 start (엔진 엑스를 사용중이라면 service nginx start)

  • Ubuntu Server 18.04 버전에서 “커널이 정상적으로 부팅되지 않고 부트로더 상태에 멈춰있는 경우에 해결방법

    서버를 리부팅시켰는데, 커널이 정상적으로 부팅이 되지 않고 부트로더 상태에서 넘어가지 않는 문제가 발생했습니다.

    자신의 서버가 다음과 같은 문제와 비슷한 상황인지 검토하십시오.

    1. 메인보드 보안부팅 해제

    서버를 재부팅하여 메인보드 바이오스 설정 모드로 전환합니다. 바이오스 접근법은 일반적으로 DEL 키나 F number key를 연타합니다. 그런데 만약 바이오스 접근이 어렵다면, 자신의 메인보드 제조사를 찾아가 문의하십시오.

    바이오스에 접근했다면 부트 설정에서 보안부팅 설정 부분을 체크 해제해야 합니다. 그 다음 과정은 설정 변경을 저장한 다음 재부팅을 하여 서버가 정상적으로 부팅이 되는지 확인합니다.

    2. 커널 패닉

    커널이 손상된 것입니다. 커널 패닉 상태를 해결하기 위해서는 커널 재설치를 진행해야 합니다. 커널 재설치를 위해서는 우분투 서버 복구가 필요하며, Live USB를 사용하여 복구 모드로 부팅해야 합니다.

    그 다음으로 커널 복구를 진행해야 합니다. 커널 복구가 정상적으로 진행됐다면, 복구 부팅을 해제 후 재부팅을 시도합니다. 마지막으로 우분투 서버가 정상적으로 부팅이 되는지 확인합니다.

    3. 만약 해결되지 않는 경우

    부팅 문제가 잘 해결되지 않는 경우 디스크 포맷 후 OS 재설치를 진행합니다. 또는 이용하고 있는 전문가의 기술지원을 알아보세요. 외부의 도움을 통하여 문제를 해결할 수 있도록 합니다.

    4. 참고 자료

  • NGINX로 워드프레스 사이트가 구동하는 경우 멀티사이트 하위 디렉토리 설정 방법

    저는 NGINX로 구동되는 워드프레스 사이트를 잘 운영하던 중에 멀티사이트를 활성화시켰습니다. 그런데 “너무 많은 리디렉션을 시도했다”고 사이트 접속이 되지 않았습니다. NGINX로 구동되는 워드프레스 멀티사이트는 서버에서 몇 가지 설정이 필요합니다.

    1. 멀티사이트 활성화

    멀티사이트를 활성화하려면 wp-config.php 파일을 FTP나 SSH vi 에디터 등으로 엽니다. 그리고 “* That’s all, stop editing! Happy blogging. */”라는 주석 아래에 다음과 같은 코드를 붙여 넣습니다.

    /* Multisite */
    define( ‘WP_ALLOW_MULTISITE’, true );

    워드프레스 알림판으로 돌아와서 메뉴 > 도구를 보면 멀티사이트 설치가 생성된 것을 확인할 수 있습니다.

    멀티사이트 설정에 대한 자세한 정보 보기(준비중)

    멀티사이트 설치를 문제 없이 잘 진행했다면 상단 메뉴에 내 사이트 > 네트워크 설정 메뉴가 생긴 것을 확인할 수 있다. 그리고 네트워크 관리자 메뉴 > 사이트에서 멀티 사이트를 개설할 수가 있다. 그런데 사이트를 개설하고 바로 접속은 불가능하다.

    멀티사이트 주소를 하위 디렉토리로 설정하는 경우와 NGINX로 구동하는 경우 몇 가지 서버 설정이 필요하다. 서버 설정은 어느 정도 서버에 대한 지식이 있으면 작업할 때 수월할 것이다. 작업하기 어렵다면 [유료서비스(준비중)]에서 의뢰할 수 있다.

    2. 플러그인 설치

    먼저 네트워크 관리자 플러그인에서 Nginx Helper라는 플러그인을 설치해 준다. 그 다음 설치가 완료되었다면 설치한 플러그인 설정 페이지를 클릭해서 “Enable Nginx Map”을 활성화한다. 이때 wp-content/uploads 파일의 쓰기 권한이 설정되어 있어야 한다. URL 매핑은 하위디렉토리로 설정된 멀티사이트가 정상적으로 접근할 수 있도록 해준다.

    3. 서버 설정

    멀티사이트와 하위디렉토리가 정상적으로 작동할 수 있도록 서버 설정을 하면 모든 과정이 마쳐진다. 서버 설정은 어느정도 서버에 대한 지식이 있으면 작업이 수월하다는 것을 다시 한번 강조한다. 서버 작업은 SSH로 할 수가 있다. 만약 내 서버 접속 정보를 알 수 없다면 서버관리자나 웹서버 제공 업체에 문의하면 된다.

    SSH로 NGINX 가상호스트 설정 파일로 이동한다. 데미안/우분투 버전 기준 파일 위치는 /etc/nginx/sites-available에 있다.

    파일 상단에 Nginx 맵 경로를 사용하여 맵 지시문을 추가해 준다.

    map $http_host $blogid {
        default 0;
        include /var/www/pathtoyoursite/wp-content/uploads/nginx-helper/map.conf;
    }
    

    위 코드를 추가해 준다면 플러그인에서 생성한 블로그 매핑을 서버가 읽어준다. 그러면 새 사이트를 추가할 때마다 플러그인이 매핑 파일을 자동으로 업데이트할 수 있어서 서버 구성을 다시 변경할 필요가 없다.

    마지막으로, 가상 호스트 파일에서 server{} 적당한 위치에 다음 지시문을 추가해 준다. 보통은 location @php{} 지시문 뒤에 붙여 넣는다.

    location ~ ^/files/(.*)$ {
      try_files /wp-content/blogs.dir/$blogid/$uri /wp-includes/ms-files.php?file=$1 ;
      access_log off; log_not_found off; expires max;
    }
    
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    	expires 24h;
    	log_not_found off;
    }
    
    location ^~ /blogs.dir {
    	internal;
    	alias /var/www/pathtoyoursite/web/wp-content/blogs.dir ;
    	access_log off; log_not_found off;      expires max;
    }
    
    
    if (!-e $request_filename) {
    	rewrite /wp-admin$ $scheme://$host$uri/ permanent;
    	rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 last;
    	rewrite ^/[_0-9a-zA-Z-]+(/.*\.php)$ $1 last;
    }
    

    마지막 지시문 블록에서 두 번째에 있는 별칭 줄을 유의해야 한다. 해당 줄은 워드프레스 설치 경로로 내 사이트 설정에 따라 변경해 주어야 한다.

    최종 단계

    수정 파일을 저장하였다면, 설정을 적용하기 위하여 Nginx를 재시작해주어야 한다.

    참고자료

    1. How to configure Nginx for WordPress Multisite with subdirectories – www.computerworld.com/article/2871918/how-to-configure-nginx-for-wordpress-multisite-with-subdirectories.html

    2. 워드프레스 멀티사이트 설치하기 – www.thewordcracker.com/intermediate/setup-wordpress-multisite/

    3. 워드프레스 멀티사이트에서 서브 도메인과 서브 디렉터리 간 전환하기 – avada.co.kr/멀티사이트-서브도메인과-서브디렉터리-간-전환/

  • 리눅스 SSH를 인증키를 사용하여 로그인하는 방법

    SSH를 인증서로 사용하여 우분투 서버에 로그인하는 방법은 보통 다음의 단계를 따릅니다.

    1. 클라이언트 키 쌍 생성: 클라이언트(예: 개발 컴퓨터)에서 SSH 키 쌍을 생성합니다. 이 단계는 클라이언트 컴퓨터에서 수행됩니다.
    2. 공개 키 서버에 추가: 클라이언트의 공개 키를 SSH 서버에 추가하여 서버가 클라이언트를 신뢰할 수 있도록 합니다. 이 단계는 서버 컴퓨터에서 수행됩니다.
    3. SSH 클라이언트 구성: 클라이언트에서 SSH 구성 파일을 수정하여 인증서를 사용하도록 설정합니다.

    여기에 각 단계를 자세히 설명하겠습니다.

    단계 1: 클라이언트 키 쌍 생성

    bashCopy code

    ssh-keygen -t rsa -b 2048

    위 명령을 실행하여 클라이언트 키 쌍을 생성합니다. 기본 설정으로 엔터를 누르면 됩니다.

    단계 2: 공개 키 서버에 추가

    bashCopy code

    ssh-copy-id -i ~/.ssh/id_rsa.pub username@server_ip

    위 명령을 실행하여 공개 키를 서버에 복사합니다. username은 서버에 로그인할 사용자 이름, server_ip는 SSH 서버의 IP 주소 또는 도메인 이름입니다.

    단계 3: SSH 클라이언트 구성

    bashCopy code

    nano ~/.ssh/config

    위 명령을 실행하여 SSH 구성 파일을 엽니다. 파일이 없으면 새로 만들 수 있습니다. 다음 라인을 추가합니다.

    javascriptCopy code

    Host server_alias HostName server_ip User username IdentityFile ~/.ssh/private_key

    여기서, server_alias는 서버에 대한 별칭, server_ip는 SSH 서버의 IP 주소 또는 도메인 이름, username은 서버에 로그인할 사용자 이름, ~/.ssh/private_key는 클라이언트의 개인 키 파일 경로입니다.

    이제 이 설정으로 SSH를 실행하면 인증서를 사용하여 서버에 로그인할 수 있어야 합니다. ssh server_alias 명령을 실행하여 서버에 로그인할 수 있습니다.

    이 단계들을 따르면 SSH 인증서를 사용하여 우분투 서버에 로그인할 수 있습니다.

    윈도우 putty에서 리눅스에서 생성한 키를 사용해 서버에 접속할거야.ChatGPT

    PuTTY를 사용하여 리눅스 서버에 SSH 키를 사용하여 접속하려면 PuTTY와 PuTTYgen을 사용하여 SSH 키를 변환해야 합니다. 다음은 이러한 작업을 수행하는 단계입니다.

    단계 1: PuTTYgen을 사용하여 키 변환

    1. PuTTYgen을 열고, ‘Load’ 버튼을 클릭하여 리눅스에서 생성한 개인 키 파일을 선택합니다.
    2. PuTTYgen은 키를 변환하고, ‘Save private key’ 버튼을 클릭하여 새로운 키 파일을 저장합니다. 이 파일을 안전한 곳에 보관하세요.

    단계 2: PuTTY 구성

    1. PuTTY를 열고, SSH 세션 설정으로 이동합니다.
    2. ‘Hostname’에는 리눅스 서버의 IP 주소나 도메인 이름을 입력합니다.
    3. ‘Port’에는 SSH가 사용하는 포트 번호(기본값은 22)를 입력합니다.
    4. 좌측 메뉴에서 ‘Connection’ > ‘SSH’ > ‘Auth’를 선택합니다.
    5. ‘Private key file for authentication’ 옵션에는 PuTTYgen을 사용하여 저장한 새로운 키 파일을 선택합니다.
    6. 이제 ‘Session’으로 돌아가서, ‘Saved Sessions’에 원하는 세션 이름을 입력하고 ‘Save’를 클릭하여 세션을 저장합니다.
    7. 이제 ‘Open’ 버튼을 클릭하여 리눅스 서버에 SSH로 접속할 수 있습니다.

    이렇게 하면 PuTTY를 사용하여 리눅스 서버에 생성된 SSH 키를 사용하여 접속할 수 있습니다.

  • 리눅스(Ubuntu)에서 sudo 패스워드 없이 사용하는 방법

    리눅스(ubuntu)에서 sudo 패스워드 없이 사용하는법

    • /etc/sudoers 파일 맨아래에 다음 내용을 추가합니다.
      – (사용자명) ALL=NOPASSWD: ALL
    • 또는 echo 명령어를 사용하여 추가할 수 있습니다.
      – echo ‘(사용자명) ALL=NOPASSWD: ALL’ >> /etc/sudoers
    • 만약 /etc/sudoers 파일이 readonly파일로 수정이 불가능한 경우에 visudo 명령어를 사용하여 파일을 수정할 수 있습니다.

    모든 sudo 권한 명령어가 패스워드 입력없이 사용되면 불안하거나 보안상 한 단계 더 어렵게 사용하고 싶다면,

    특정 명령어(자주사용되는)만 패스워드 입력없이 sudo 권한을 사용하는 방법도 있습니다.

    특정 명령어만 PASSWD 입력 없이 sudo 권한을 사용하는법

    • echo 명령어를 사용하여 추가하는 방법
      – echo ‘(사용자명) ALL=NOPASSWD: (특정 명령어)’ >> /etc/sudoers
      – echo ‘(사용자명) ALL=NOPASSWD: (/usr/sbin/useradd, /usr/sbin/userdel)’ >> /etc/sudoers
  • 워드프레스 멀웨어 제거하기

    워드프레스는 국제적으로 가장 많이 사용하는 웹프로그램이다보니 해커들의 공격 대상이 되기가 쉽다. 워드프레스로 만든 웹사이트들이 많이 당할 수 있는 공격은 멀웨어 삽입이라고 한다.

    최근 우크라이나 전쟁 같은 국지적 도발이 일어나면서 사이버 공격이 잦아, 사이버 공격을 대비할 필요가 있다.

    워드프레스에서 알 수 없는 스크립트가 실행되거나 내가 모르는 파일이 업로드되었다면 삭제하거나 적절한 조치를 취해야 한다(가능한 빠른 시일 내에 조치를 취하는 것이 좋다).

    주요 감염 루트

    해커의 시도는 다양해 질 수가 있다. js 파일을 변조한다거나 관리자가 wp-admin에 접근하지 못하도록 .htaccess 파일에 변조를 일으키는 등 문제를 일으킬 수 있다.

    1. index.php 상단에 알 수 없는 명령어가 실행되는 경우
    2. 워드프레스 root(루트) 폴더에 낯선 파일이나 폴더가 실행된 경우
    3. wp-content, plugins, themes 폴더도 해커의 공격 대상이 될 수 있다.
    4. Newspaper과 같은 테마 패널이 제공되고 있는 유료 테마를 사용하는 경우 ‘커스텀 코드’에서 ‘커스텀 자바스크립트’에 낯선 코드가 입력되어 있는 경우 멀웨어를 의심해 볼 수가 있다.

    멀웨어 예방법

    먼저, 멀웨어 예방에는 정답은 없다.

    삭제하거나 적절한 조치를 하더라도 보안 조치가 허술하거나 미흡하다면 해커가 언제든지 멀웨어를 삽입 시도를 할 수 있다.

    1. 백업을 생활화한다(웹사이트의 파일과 DB를 PC로 다운로드 받아 놓는다).
    2. 폴더는 755, 파일은 644로 퍼미션을 설정한다.
    3. wp-config.php, wp-content 폴더 관리를 신중히 한다(만약 wp-config.php가 털린 상태라면 기본으로 제공된 샘플 파일과 비교하여 체크하도록 한다).
    4. 만약 해커에게 털린 경우라면, ftp, db 등 계정의 패스워드를 모두 변경하도록 한다.
    5. 자동 업데이트보다는 수동으로 작업을 해본다.

    구글 검색에서의 불리한 점

    멀웨어가 삽입되어 비정상적으로 사이트가 작동되는 경우 구글 검색에서 순위가 밀리거나 최악의 경우 웹기록이 삭제가 되어 버리는 경우가 발생한다.

    이때 웹마스터 도구에서 해당 사이트를 삭제한 후 다시 재등록하여 검수를 요청하면 구글 웹로봇이 알아서 체크 후 판단할 수 있게 된다.

  • Phpmyadmin /php/Twig/Extension/CoreExtension.php#1608 에러 해결 방법

    Phpmyadmin을 이용하여 DB 작업을 할 때, CoreExtension.php #1608 라인에 에러가 있을 수가 있다. 물론 에러를 무시하고 작업해도 상관은 없지만,

    무언가 거슬리고 찝찝한 느낌이 드는 것을 치울 수가 없다.

    Deprecation Notice in ./../../php/Twig/Extension/CoreExtension.php#1608 array_key_exists(): Using array_key_exists() on objects is deprecated. Use isset() or property_exists() instead

    상기한 경로의 파일의 1608 라인에 array_key_exists() 라는 함수 대신 property_exists() 함수를 사용하라는 말이다.

    다음과 같이 바꿔주면 된다.

    if (isset($object->$item) || property_exists($object, (string) $item)) {

    위 오류는 최근 깃허브 자료를 보니 수정된 것으로 확인되는 것 같다.

    참고자료 :
    https://stackoverflow.com/questions/66222481/phpmyadmin-coreextension-php1608array-key-exists-using-array-key-exists-on

    https://github.com/phpmyadmin/phpmyadmin/issues/17270

  • 워드프레스 wp-load.php 50라인 오류

    필자는 요새 잦은 해킹 공격과 오류 발생으로 고통 받고 있는 지극히 평범한 회사 사이트 관리자이다.

    보안상 전체 오류 로그를 보일 수는 없고 일부만 가져오자면…

    Fatal error: require_once(): Failed opening required

    failed to open stream: permission denied in…. 중략…. wp-load.php 50 line

    wp-config.php 파일의 위치를 알 수 없어서 생기는 오류이다.

    이 경우 보통은 파일 퍼미션 문제로 서버에 접속해 퍼미션을 변경해 주면 된다.

    chmod 707 wp-content