web-dev-qa-db-ja.com

安全なローカルホスティングのためのLinuxボックスのセットアップのAからZ

私は、ビジネス用のいくつかのアプリケーションをホストするために使用されるマシンにOSを再インストールしているところです。アプリケーションはローカルのみになります。外部クライアントからのアクセスはVPN経由のみになります。

以前のセットアップでは、ほとんどの管理者にホスティングコントロールパネル(Plesk)を使用し、再インストールに別の同様のソフトウェアを使用することを検討していましたが、最終的にすべてがどのように機能するかを学ぶ必要があると思いました。私はソフトウェアが私のために行うことのほとんどを行うことができますが、すべての共生についてははっきりしていません。これはすべて、可能であれば、 構成プログラマー/プログラマー の土地から自分自身をさらに遠ざける試みです。

私が探しているものの完全なウォークスルーがどこにも見つからないので、私はこの質問をするつもりでした、そして人々が途中で私を助けてくれるなら、私はこれを答えで編集し、私の進捗状況を文書化します/落とし穴。うまくいけば、いつかこれが誰かを助けてくれるでしょう。

詳細:

  • CentOS 5.5 x86_64
  • httpd:Apache/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 wikiの好意によるアップグレード手順: http://wiki.iuscommunity.org/Doc/ClientUsageGuide


  • rssh(制限付きシェル)をインストールして、scpログインを許可せずに、sftpおよびsshアクセスを提供します
  • 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.confを編集して、rsshユーザーにSFTPへのアクセスを許可します。

    vi /etc/rssh.conf
    

    コメントを外すか、追加します。

    allowscp
    allowsftp
    

    これにより、TransmitのSFTPプロトコルを介してマシンに接続できます(選択したFTPプログラム。他のFTPアプリケーションと同様であると確信しています)。

    http://www.cyberciti.biz/tips/linux-unix-restrict-Shell-access-with-rssh.html から(感謝を込めて!)割り当てられたrssh命令。


  • 仮想インターフェイスを設定します
  • 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 =はい
    NAME = eth1:1

    繰り返して、必要に応じて仮想インターフェイスを追加します。 ifcfg-eth1:1ファイルのONBOOT=yes行のため、このインターフェイスは、システムの起動時、またはネットワークの起動/再起動時に起動されます。

    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 time = 0.105 ms


  • Virtualhosts
  • 上記のrsshセクションで、SFTPに使用するユーザーを追加しました。このユーザーのホームディレクトリに、「https」というフォルダを作成しました。これは、このサイトのドキュメントが存在する場所であるため、それを指す仮想ホストを追加する必要があります。このサイトには上記の仮想インターフェイス(ここではdev.site.localと呼びます)を使用します。

    vi /etc/http/conf/httpd.conf
    

    Httpd.confの最後に以下を追加します。

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

    すべてをチェックするために、ダミーのindex.htmlファイルをhttpsディレクトリに配置しました。私はそれを閲覧しようとしましたが、許可拒否エラーが発生しました。ログは、何が起こっているのかについてのあいまいな参照を提供するだけでした。

    [2010年5月17日月曜日14:57:11] [エラー] [クライアント192.168.1.100](13)アクセスが拒否されました:/index.htmlへのアクセスが拒否されました

    Chmod777などを試してみました。 al。、しかし役に立たない。結局、httpsディレクトリとその親ディレクトリをchmod + xする必要がありました。

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

    これでその問題は解決しました。


  • [〜#〜] dns [〜#〜]
  • ローカルのWindowsServer2003ボックスを介して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 [email protected]  
        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
    

    証明書を反映するようにhttpd.confを更新し、SSLEngineをオンにしました。

    NameVirtualHost 192.168.1.3:443 
    
    <VirtualHost 192.168.1.3:443>
        ServerAdmin [email protected]  
        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をWebでアクセス可能な場所に置き、ブラウザにダウンロード/インポートしました。これで、エラーや警告なしで https://dev.site.local にアクセスできます。


    そして、これが私がいるところです。進歩するにつれて、これを編集し続けます。 SSL電子メールを構成する方法、および/またはMySQLサーバーとなる別のボックスへの安全な接続を構成する方法に関するヒントをいただければ幸いです。

    12
    stormdrain

    SSL構成の問題は、実際にはenabled SSLを使用していないことです。そのためには、Apacheディレクティブが必要です。

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

    これがないと、これらのレコードの長すぎるエラーが発生します。これは、ブラウザが予期していたSSLヘッダーの代わりに、暗号化されていないWebページだけが大きなチャンクで取得されるためです。

    1
    JamesHannah

    元のパッケージのMySQLはSSLをサポートしています。 MySQLビルドを確認するには、

    mysqladmin variables | grep ssl
    

    have_ssl yesのようなものが見つかるはずです。オプションssl-cassl-key、およびssl-certを設定します。

    SSL要件を持つユーザーアカウントを作成します。

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