안전한 로컬 호스팅을위한 Linux 박스 설정의 A ~ Z


12

우리 사업을 위해 몇 가지 응용 프로그램을 호스팅하는 데 사용할 컴퓨터에 OS를 다시 설치하는 중입니다. 응용 프로그램은 로컬 전용입니다. 외부 클라이언트로부터의 액세스는 VPN을 통해서만 이루어집니다.

이전 설정에서는 대부분의 관리자가 호스팅 제어판 (Plesk)을 사용했으며 다시 설치하는 데 비슷한 소프트웨어를 사용하는 것을보고 있었지만 결국 모든 작동 방식을 배워야한다는 것을 알았습니다. 나는 소프트웨어가 나를 위해 할 수있는 대부분의 일을 할 수 있지만, 그 모든 것의 공생에 대해서는 확실하지 않다. 이것은 가능한 경우 Configuration Programmer / Programmer 의 땅에서 멀어 지려고 시도하는 것 입니다.

나는 내가 찾고있는 곳 어디에서나 전체 연습을 찾을 수 없으므로이 질문을 넣을 것이라고 생각했고 사람들이 나를 도울 수 있다면 대답으로 편집하고 진행 상황을 문서화 할 것입니다. 함정. 바라건대 언젠가 이것이 누군가를 도울 수 있기를 바랍니다.

세부 사항 :

  • CentOS 5.5 x86_64
  • httpd : 아파치 /2.2.3
  • MySQL : 5.0.77 (업그레이드 예정)
  • PHP : 5.1 (업그레이드 예정)

요구 사항:

  • 보안!!
    • 안전한 파일 전송
    • 안전한 클라이언트 액세스 (SSL 인증서 및 CA)
    • 안전한 데이터 저장
    • 다른 로컬 컴퓨터 (MySQL)에 안전하게 연결
  • 가상 호스트 / 여러 하위 도메인
  • 로컬 이메일은 좋지만 중요하지는 않습니다.

단계들:

  • 최신 CentOS DVD-iso를 다운로드하십시오 .

  • CentOS 설치 : 설치를
    진행하는 동안 다른 Plesk와 유사한 관리자를 사용한다고 생각하는 서버 구성 요소 옵션을 확인했습니다. 내 생각에, 나는 내 자신의 길을 가기로 결정했다는 것을 고려할 때, 이것은 아마도 최고의 아이디어는 아니 었습니다.

  • 기본 구성 :
    설정 사용자, 네트워킹 / IP 주소 등 Yum 업데이트 / 업그레이드.

  • PHP / MySQL
    업그레이드 : PHP와 MySQL을 최신 버전으로 업그레이드하려면 CentOS 외부의 다른 리포지토리를 찾아야했습니다. IUS는 멋져 보이고 그것을 발견해서 기쁘다!
  • 패키지 관리자에 IUS 저장소 추가

    cd /tmp
    wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/5/x86_64/epel-release-1-1.ius.el5.noarch.rpm
    rpm -Uvh epel-release-1-1.ius.el5.noarch.rpm
    wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/5/x86_64/ius-release-1-4.ius.el5.noarch.rpm
    rpm -Uvh ius-release-1-4.ius.el5.noarch.rpm
    yum list | grep -w \.ius\. # list all the packages in the IUS repository; use this to find PHP/MySQL version and libraries you want to install
    

    이전 버전의 PHP를 제거하고 IUS에서 최신 버전을 설치하십시오.

    rpm -qa | grep php # to list all of the installed php packages we want to remove
    yum shell  # open an interactive yum shell
    remove php-common php-mysql php-cli #remove installed PHP components
    install php53 php53-mysql php53-cli php53-common #add packages you want
    transaction solve #important!! checks for dependencies
    transaction run #important!! does the actual installation of packages.
    [control+d] #exit yum shell
    php -v
    PHP 5.3.2 (cli) (built: Apr  6 2010 18:13:45)
    

    IUS 저장소에서 MySQL 업그레이드

    /etc/init.d/mysqld stop
    rpm -qa | grep mysql # to see installed mysql packages
    yum shell
    remove mysql mysql-server #remove installed MySQL components
    install mysql51 mysql51-server mysql51-devel
    transaction solve #important!! checks for dependencies
    transaction run #important!! does the actual installation of packages.
    [control+d] #exit yum shell
    service mysqld start
    
    mysql -v
    Server version: 5.1.42-ius Distributed by The IUS Community Project
    

    IUS 위키의 업그레이드 지침 사의 씨 http://wiki.iuscommunity.org/Doc/ClientUsageGuide .


  • 로그인 을 허용하지 않고 rssh (제한된 셸)를 설치 scp및 제공sftpssh
  • cd /tmp
    wget http://dag.wieers.com/rpm/packages/rssh/rssh-2.3.2-1.2.el5.rf.x86_64.rpm
    rpm -ivh rssh-2.3.2-1.2.el5.rf.x86_64.rpm
    useradd -m -d /home/dev -s /usr/bin/rssh dev
    passwd dev
    

    /etc/rssh.confrssh 사용자에게 SFTP에 대한 액세스 권한을 부여하도록 편집하십시오 .

    vi /etc/rssh.conf
    

    주석 해제 또는 추가 :

    allowscp
    allowsftp
    

    전송에서 SFTP 프로토콜을 통해 컴퓨터에 연결할 수 있습니다 (FTP 프로그램 선택; 다른 FTP 응용 프로그램과 유사하다고 확신합니다).

    rssh 지침에서 (감사와!) 충당 http://www.cyberciti.biz/tips/linux-unix-restrict-shell-access-with-rssh.html .


  • 가상 인터페이스 설정
  • ifconfig eth1:1 192.168.1.3 up #start up the virtual interface
    cd /etc/sysconfig/network-scripts/
    cp ifcfg-eth1 ifcfg-eth1:1 #copy default script and match name to our virtual interface
    vi ifcfg-eth1:1 #modify eth1:1 script
    

    # ifcfg-eth1 : 1 | 다음과 같이 수정하십시오 :
    DEVICE = eth1 : 1
    IPADDR = 192.168.1.3
    NETMASK = 255.255.255.0
    NETWORK = 192.168.1.0
    ONBOOT = yes
    NAME = eth1 : 1

    필요한만큼 반복하여 가상 인터페이스를 추가하십시오. ONBOOT=yesifcfg-eth1 : 1 파일 의 행으로 인해 시스템이 부팅되거나 네트워크가 시작 / 재시작 될 때이 인터페이스가 나타납니다.

    service network restart
    

    인터페이스 eth0 종료 : [OK]
    인터페이스 eth1 종료 : [OK]
    루프백 인터페이스 종료 : [OK]
    루프백 인터페이스 시작 : [OK]
    인터페이스 eth0 가져 오기 : [OK]
    인터페이스 eth1 가져 오기 : [OK]

    ping 192.168.1.3
    

    192.168.1.3에서 64 바이트 : icmp_seq = 1 ttl = 64 시간 = 0.105ms


  • 가상 호스트
  • 위의 rssh 섹션에서 SFTP에 사용할 사용자를 추가했습니다. 이 사용자의 홈 디렉토리에 'https'라는 폴더를 만들었습니다. 이 사이트에 대한 문서가있는 곳이므로 가상 호스트를 추가해야합니다. 이 사이트에 대해 위의 가상 인터페이스를 사용합니다 (여기서는 dev.site.local이라고 함).

    vi /etc/http/conf/httpd.conf
    

    httpd.conf 끝에 다음을 추가하십시오.

    <VirtualHost 192.168.1.3:80>  
        ServerAdmin dev@site.local  
        DocumentRoot /home/dev/https  
        ServerName dev.site.local  
        ErrorLog /home/dev/logs/error_log  
        TransferLog /home/dev/logs/access_log  
    </VirtualHost>  
    

    나는 모든 것을 체크 아웃하기 위해 더미 index.html 파일을 https 디렉토리에 넣었다. 탐색을 시도했지만 권한 거부 오류가 발생했습니다. 로그는 진행중인 작업에 대한 명확한 참조 만 제공했습니다.

    [월 5 월 17 일 14:57:11 2010] [오류] [클라이언트 192.168.1.100] (13) 권한 거부 : /index.html에 대한 액세스가 거부되었습니다.

    나는 chmod 777 등을 시도했다. al., 그러나 아무 소용이 없습니다. https 디렉토리와 그 부모 디렉토리를 chmod + x해야했습니다.

    chmod +x /home
    chmod +x /home/dev
    chmod +x /home/dev/https
    

    이것은 그 문제를 해결했다.


  • DNS
  • 로컬 Windows Server 2003 상자를 통해 DNS를 처리하고 있습니다. 그러나 BIND에 대한 CentOS 문서는 http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-bind.html 에서 찾을 수 있습니다 .


  • SSL
  • SSL을 작동시키기 위해 httpd.conf에서 다음을 변경했습니다.

    NameVirtualHost 192.168.1.3:443 #make sure this line is in httpd.conf 
    
    <VirtualHost 192.168.1.3:443>  #change port to 443
        ServerAdmin dev@site.local  
        DocumentRoot /home/dev/https  
        ServerName dev.site.local  
        ErrorLog /home/dev/logs/error_log  
        TransferLog /home/dev/logs/access_log  
    </VirtualHost>  
    

    불행히도 SSL로 페이지에 액세스하려고 할 때 (오류 코드 : ssl_error_rx_record_too_long) 오류가 계속 발생합니다. JamesHannah가 아래 에서 정상적으로 지적했듯이 , 나는 httpd.conf에 인증서의 위치를 ​​설정하지 않았으므로 브라우저가 엉뚱한 인증서를 만들 때 브라우저에서 페이지를 가져 왔습니다.

    먼저 CA 를 설정하고 인증서 파일을 만들어야했습니다. http://www.debian-administration.org/articles/284 에서 프로세스에 대한 훌륭한 연습이 발견되었습니다 .

    이 기사에서 취한 관련 단계는 다음과 같습니다.

    mkdir /home/CA
    cd /home/CA/
    mkdir newcerts private
    echo '01' > serial
    touch index.txt #this and the above command are for the database that will keep track of certs  
    

    디렉토리에 openssl.cnf파일을 작성하고 /home/CA/위에 링크 된 연습 에 따라 파일을 편집하십시오. (참고로 완성 된 openssl.cnf 파일은 다음과 같습니다. http://pastebin.com/raw.php?i=hnZDij4T )

    openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650 -config ./openssl.cnf #this creates the cacert.pem which gets distributed and imported to the browser(s)
    

    openssl.cnf연습 지침에 따라 다시 수정 되었습니다.

    #generates certificate request, and key.pem which I renamed dev.key.pem.
    openssl req -sha1 -new -nodes -out dev.req.pem -config ./openssl.cnf 
    

    openssl.cnf연습 지침에 따라 다시 수정 되었습니다.

    #create and sign certificate.
    openssl ca -out dev.cert.pem -md sha1 -config ./openssl.cnf -infiles dev.req.pem 
    

    중대한!

    파일을 이동하고 새 위치의 httpd.conf에서 참조하십시오

    cp dev.cert.pem /home/dev/certs/cert.pem
    cp dev.key.pem /home/certs/key.pem
    

    인증서를 반영하고 SSLEngine을 켜도록 httpd.conf를 업데이트했습니다.

    NameVirtualHost 192.168.1.3:443 
    
    <VirtualHost 192.168.1.3:443>
        ServerAdmin dev@site.local  
        DocumentRoot /home/dev/https  
        SSLEngine on
        SSLCertificateFile /home/dev/certs/cert.pem
        SSLCertificateKeyFile /home/dev/certs/key.pem
        ServerName dev.site.local
        ErrorLog /home/dev/logs/error_log
        TransferLog /home/dev/logs/access_log
    </VirtualHost>  
    

    CA cert.pem을 웹에 액세스 할 수있는 장소에 넣고 브라우저로 다운로드 / 가져 오기하십시오. 이제 오류나 경고없이 https : //dev.site.local 을 방문 할 수 있습니다 .


    그리고 내가있는 곳입니다. 진행하면서 계속 편집하겠습니다. SSL 이메일을 구성하고 MySQL 서버가 될 다른 Box에 대한 보안 연결을 구성하는 방법에 대한 팁을 주시면 감사하겠습니다.


    가상 네트워크 인터페이스가 왜 필요한지 모르겠습니다.
    밀라노 Babuškov

    이 컴퓨터에 여러 도메인 / 하위 도메인이 있기 때문에 @Milan. VirtualHost 및 SSL을 사용하려면 각 도메인 / 하위 도메인에는 고유 한 IP 주소가 있어야합니다. httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts
    stormdrain

    나에게는 IP 주소 낭비처럼 보이지만 괜찮습니다. 또는 단일 IP에서 각 도메인마다 다른 TCP / IP 포트를 사용할 수 있습니다. 그렇게하면 웹 서버는 시스템 구성에 덜 의존합니다.
    밀라노 Babuškov

    1
    @Milan : 설정은 로컬 전용이므로 필자가 필요로하는 것보다 더 많은 IP 주소를 사용할 수 있습니다. 내가 찾은 추가 인터페이스를 설정하는 것은 비교적 빠르고 고통없는 프로세스입니다. Apache2.2.x 및 TLS 업그레이드 덕분에이 시스템을
    공개용

    1
    koltsoff.com/pub/securing-centos를 강력 추천합니다 -CentOS 보안에 대한 매우 교육적인 연습 (대부분 다른 배포판에 쉽게 적용 가능)-호스팅을 다루지는 않지만 모든 것을 이해하고 적용해야합니다. 당신이 이해하고 통제하는 방화벽 뒤에 있지 않은 CentOS 서버.
    dunxd

    답변:


    6

    이 안내서에는 Apache에서 SSL을 사용하는 방법에 대한 많은 답변이 있으며 자체 서명 된 인증서를 작성하는 방법, 공인 된 인증 기관 (CA)에서 적절한 인증서를 얻는 방법 및 신뢰할 수없는 자체 CA를 작성하여 전체 인증서. http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html

    가상 호스트 및 SSL의 경우 각 호스트마다 고유 한 IP 주소가 필요하거나 :443SSL 인증서의 특성으로 인해 표준과는 다른 포트에서 호스트를 호스트하는 것이 더 더러운 솔루션입니다 . 이름 기반 가상 호스팅은 SSL과 함께 사용되지 않습니다. 그렇기 때문에 차별화 할 다른 방법이 필요합니다. 다른 포트 / IP.

    SSH 설정은 매우 쉽습니다. 서버에서 이미 실행 중이어야합니다. 잠그기 위해 여러 가지 작업을 수행하려고합니다.

    PermitRootLogin no
    AllowGroups admins
    PubkeyAuthentication yes
    PermitEmptyPasswords no
    PasswordAuthentication no
    

    /etc/ssh/sshd_config공개 / 개인 키 쌍을 사용하여 로그인하는 대신 원격 루트 액세스를 제한하고 비밀번호 인증을 제거 하기 위해 추가 할 수 있습니다 .

    SSH 키쌍을 만들려면 puttygenWindows에서 사용할 수 있습니다 . http://putty.very.rulez.org/download.html 또는 Linux 환경에서 다음과 같이 키 쌍을 만들 수 있습니다 ssh-keygen -b 2048 -t RSA -f my_keypair. 이렇게하면 my_keypair파일과 파일 이 생성 my_keypair.pub됩니다 (이 예제에서만 이름이 지정됩니다. 사용자 이름의 이름을 지정하거나 off -f인 채로 생성하도록 제안 할 수 있습니다 ~/.ssh/id_rsa).

    my_keypairSSH 액세스를 위해 워크 스테이션으로 안전하게 전송 하십시오. 이것은 개인 키이므로 다른 사람과 공유해서는 안됩니다. 그런 다음 서버에 생성, $HOME/.ssh이미 존재하지 않는 경우, mkdir ~/.ssh다음 (공개 키를 복사 my_keypair.pub)하는 ~/.ssh/당신이 이미 가지고있는 경우 authorized_keys~/.ssh당신은 무엇을 위해이 일을했기 때문에, 당신이 할 수있는 cat my_keypair.pub >> authorized_keys공개 키를 추가하거나 cp my_keypair.pub authorized_keys경우 존재하지 않습니다.

    이제 실행 chmod 700 ~/.ssh하고 chmod 644 ~/.ssh/my_keypair.pub ~/.ssh/authorized_keys권한을 설정하십시오. 당신의 사본을 유지할 수 my_keypair있는을 ~/.ssh/다른 호스트에 연결할 때 사용하기 위해,하지만 당신은 어떻게해야 chmod 600 ~/.ssh/my_keypair확실히 아무도 다른가 액세스 할 수에게 그것을하지 않습니다 수 있습니다.

    당신은 자신을 위해 일반 사용자 계정을 추가하고, 이외의 다른 그룹에 자신을 추가 할 것 users같은, admins내 예이다.

    사용하지 않으 려면 사용자 또는 그룹을 추가하여 사용 /etc/sudoers하도록 설정하십시오 sudo. 이것은 visudo이 파일을 편집해야하는 유일한 방법 인 명령으로 수행 됩니다. visudo쓰기 전에 구성에서 오류 및 구문 검사를 실행하여 sudo사용 손실을 방지 합니다.

    username ALL=(ALL) ALL
    

    추가 /etc/sudoers허용 username실행 sudo yum install blah하고 자신의 암호를 묻습니다. 다른 관리자 나 임시 관리자가있는 경우 루트 암호를 공유하지 않아도됩니다.


    puttygen의 Windows에서 키 쌍을 작성하는 경우 공개 키를 서버에 업로드 한 후에는 공개 키의 형식을 변경해야합니다. 유튜브가 어떻게 비디오인지 실제로 기억하지 못합니다.
    ESW

    1

    SSL 구성의 문제점은 실제로 SSL을 활성화 하지 않았다는 것입니다. Apache 지시문이 필요합니다.

    SSLEngine on
    SSLCertificateFile /path/to/cert.pem
    SSLCertificateKeyFile /path/to/key.pem
    

    이것이 없으면 너무 긴 오류가 발생합니다. 브라우저에서 예상 한 SSL 헤더 대신 암호화되지 않은 웹 페이지가 큰 덩어리로 표시되기 때문입니다.


    1
    (이것없이 포트 443에서 수신하는 일반 비 SSL 가상 호스트 만
    있으면됩니다

    1

    원래 패키지의 MySQL은 SSL을 지원합니다. MySQL 빌드를 확인하려면 다음을 실행하십시오.

    mysqladmin variables | grep ssl
    

    와 같은 것을 찾아야합니다 have_ssl yes. 옵션을 설정 ssl-ca, ssl-keyssl-cert.

    SSL 요구 사항으로 사용자 계정을 작성하십시오.

    create user@host identified by 'password'
    grant privilegelist on database.tables to user@host require ssl
    

    답변 주셔서 감사합니다. 그러나 db 서버에 파일을 저장 하므로이 경우 stunnel이 더 잘 작동하는 것처럼 보입니다.
    stormdrain 2:20에
    당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
    Licensed under cc by-sa 3.0 with attribution required.