LABO IWASAKI

Ubuntuインストール

設定とセキュリティ

クラウドやVPSにUbuntuを。
インストール時の設定とセキュリティまとめ。
これだけやれば結構大丈夫なレベルになります。

自分でサーバー作ると心配ですよね。
特に初めてだとセキュリティ怖いし。
設定訳分かんないし。そんなまとめです。

Ubuntuを使う!

Ubuntu

初めてクラウドサーバーやVPSなどに自分でサーバーを作る時、やっぱり設定が難しいし、セキュリティが心配です。
僕もかなり怖くてなかなか公開できなかった記憶が強く残っています。

今回は最低限、これだけやってりゃ大丈夫な設定を書いておきます。
そりゃ突っ込んだらもっと色々ありますが、この設定やってれば乗っ取られたりしないです。

僕もこの設定で数年数サイト運営しましたが大丈夫でした。

だからと言って「完璧」ではない事を了承しておいてください。あくまでも私見です。

あと、ここから先は自分で勉強した方が絶対自分の為です。僕もまた書くとおもいますが…。

サーバーにUbuntuが入ってる前提で、まっさらな状態を仮定して書いています。自サバではないのでご理解ください。

また、以下の設定で不利益を被っても当サイトは何も保証しませんし、責任もとりません。大丈夫だと思いますが、あくまで参考としておいてください。

初期設定する

Initial setting

※これはUbuntu 14の場合の記事です


ではSSHでログインして、必要なものをインストールしていきます。

ターミナルなどの使い方は割愛しますので、ご自身でお調べください。
Macの場合は「ターミナル」で操作が可能です。

 初期設定 
 ssh -p 22 -l ユーザー名 123.456.78.901

「123.456.78.901」は仮のIPアドレスです。
ユーザー名とIPアドレスは自分のを使ってくださいね。

ログインしたら、まず全てアップデートします。
全部を最新の状態にして使いたいからです。

 すべてUPDATE 
$ sudo apt-get update [sudo] password for hoge: ... $ sudo apt-get upgrade

次にUbuntuを日本語化します。これしないと英語でベラベラしゃべられます。
意味分かんないので、これはやっておいた方がいいかと。

 日本語化する 
# 最初に日本語パッケージをインストール。 $ sudo apt-get -y install language-pack-ja [sudo] password for hoge: ... # 言語パッケージを生成・更新。 $ sudo dpkg-reconfigure locales ... en_ZW.UTF-8... done ja_JP.UTF-8... up-to-date # デフォルト言語をUTF-8日本語に設定します。 $ sudo update-locale LANG=ja_JP.UTF-8

注意!
以下のようなエラー表示が出ますが無視で大丈夫です。

 無視するエラー 
$ sudo update-locale LANG=ja_JP.UTF-8 *** update-locale: Warning: LANGUAGE ("en_US:") is not compatible with LANG (ja_JP.UTF-8). Disabling it.

まず、ここまでやって、ログアウトしてログインしたら日本語化されているはずです。
されてなかったら再起動がいるのかも知れません。(たぶんいらない)

ソフトをインストール

Installation

次に、必要なソフトをインストールします。
ここではPHPとDB(MySQL)を使えるようにします。

まずiptablesとVim(エディタ)をインストールします。
iptableは入ってる場合もありますが、その際でも重複しないのでインストールしておきます。
エディタは有名なVimを入れますが、お好みで別のを入れても大丈夫です。

 インストール 
$ sudo apt-get -y install iptables ... $ sudo apt-get -y install vim ...
 アパッチ2 
$ sudo apt-get -y install apache2

apache2は必ず入れます。

 PHPインストール 
$ sudo apt-get -y install php5 libapache2-mod-php5 $ sudo apt-get -y install php5-cli php5-mysql php5-common php5 php5-cgi php5-fpm php5-gd $ sudo apt-get -y install php5-dev $ sudo apt-get -y install libmysqlclient-dev sudo apt-get -y install php5-mcrypt

PHPはこれだけ入ってればPHPを使う場合のソフトが一通りあるので困りません。
また、このように複数をインストールする場合は半角スペースで区切ると同時にいけます。

 MySQLインストール 
sudo apt-get install mysql-server

これで必要なソフトがインストールできました。
ここからはセキュリティを強化していきましょう。

セキュリティ強化

Security

まず不正なアクセスをBanしてくれるfail2banを入れます。
ハッキング(クラッキング)しようとアクセスしてきた奴をIPごとアクセス不能にしてくれる優れ物です。
そしてメールで報告してくれます。

 fail2banインストール 
sudo apt-get -y install fail2ban
 設定編集 
sudo vim /etc/fail2ban/jail.conf vim操作 x  … 削除 cw … 文字の置き換え esc … ノーマルモードに戻る :q! … 保存せず終了 :wq … 保存して終了

以下のenabletrueにすると有効になる

 以下の部分を編集 
[ssh] enabled = true port = 監視したいポート番号 SSHなら22 filter = sshd logpath = /var/log/auth.log maxretry = 3 何回失敗したらBanするか banした情報をメールで受け取る
メールが不要なら無視
destemail = root@localhost(これを指定アドレスに変更) この部分を以下に変更 action = %(action_)s    ↓ action = %(action_mwl)s vim操作 x  … 削除 cw … 文字の置き換え esc … ノーマルモードに戻る :q! … 保存せず終了 :wq … 保存して終了

設定が終わったら「fail2ban」をリスタートして設定を反映します。

 リスタート 
sudo /etc/init.d/fail2ban restart

設定を確認する場合は以下で可能です。

 設定を確認する 
sudo fail2ban-client status

ユーザーを追加する

adding user

次にユーザーを追加します。
今はadminとかで入ってませんか?
危険なので別のユーザーを追加して、そっちを使いましょう。

 ユーザーを追加する 
$ sudo adduser ユーザー名 ※ useradd ではホームディレクトリを作成しないので注意
 管理権限グループへの追加 
$ sudo gpasswd -a ユーザー名 sudo ※ $ usermod -G sudo ユーザ名 では設定以外のグループの所属が消えてしまうので注意。

秘密キーを作る

Secret key

次に秘密キーをつくります。
これで簡単な不正アクセスはほぼ不可能になります。
僕はこれなしでは怖くて使えません。

この作業にはターミナルを2つ開きます。
サーバーにログインしたターミナルと、PC側の操作をするターミナルです。

まず、サーバーに接続されているターミナルを操作します。

 現在地確認 
$ pwd たぶん home/ユーザー名/と表示されると思いますが、そうでない場合は以下のように「cd」と入力してください。 $ cd 「cd」は「カレントデリィレクトリ」という意味で「作業するディレクトリ」を指定します。
cdとだけ入力するとhomeに帰ります。
 保管ディレクトリを作る 
$ mkdir ~/.ssh mkdir(make directoryのコマンド)ディレクトリを作成 .ssh (.を付けて隠しファイルのsshという名前を作成)
 パーミッションを指定する 
$ chmod 700 ~/.ssh

ローカル
次に、もぅひとつターミナルを開きます。
これはサーバーに接続しないでください。ローカル環境での作業です。

 ローカルのターミナル 
$ ssh-keygen パスの設定を要求されるが、デフォルトで大丈夫なので 何も入力せずに enter を押す。 次に再度パス入力を求められるが、これもそのまま enter
 確認する(ローカル) 
$ ls -la .ssh ls (リスト) -la (lsのオプションで、隠しファイルも表示する) 次のファイルが出来ている id_rsa (秘密鍵) id_rsa.pub (公開鍵)

ファイルが出来ていなかったら次にいけません。

 公開鍵を転送する(ローカル) 
公開鍵のパーミッションを600にする chmod 600 ~/.ssh/id_rsa.pub 名前を付けてサーバーに転送する $ scp ~/.ssh/id_rsa.pub ユーザー名@ipアドレス:~/.ssh/authorized_keys yes / no を聞かれるので yes パスワードを求められるので入力

オンライン
次に、Ubuntuにログインしているターミナルに戻ります。
接続されてるターミナルですよ。間違わないでね。
まぁ、ちゃんと出来てるか確認するだけなんですがね…。

 確認する(サーバー) 
ファイルがちゃんと入っているか確認する $ ls -la .ssh authorized_keysがあればOK

ローカル
ローカルのターミナルで操作します。
ファイルがちゃんと出来てたら、実際にログインしてみます。

 秘密鍵でログイン(ローカル) 
ssh -i ~/.ssh/id_rsa ユーザー名@ipアドレス -i は秘密鍵を使うという指定オプション パスワードを要求されずログインできたら成功 一度ログアウトする $ exit 次に、以下でログインしてみる
これでもログインできるはずです。
$ ssh ユーザー名@ipアドレス

Ubuntuに秘密鍵でログインできたでしょうか?
ちゃんと接続できたらOK。これでローカル側のターミナルは閉じてください。
次はSSHのセキュリティ設定をしていきます。

SSHセキュリティ

SSH Security

秘密鍵を使ってログインできたら、パスワードを封印します。
これで秘密鍵を持っているアナタしかログインできません。
パスワード総当たり攻撃とかできなくなります。

 SSHを設定する1 
ポート変更 sudo vim /etc/ssh/sshd_config 「port」を任意の1万番台にする(14484 など) ルートログインを禁止する PermitRootLogin no パスワードログインを禁止する #PasswordAuthentication yes  先頭に「#」を付けて、下に記述を追加 PasswordAuthentication no 指定したユーザーだけログイン可能にする (最下段に追加) AllowUsers ユーザー名
 SSHを設定する2 
sudo vim /etc/services この中の22という番号を全て上で指定した番号に変更する sudo sshd -t 確認(なにも起こらなければOK) sshサーバーを再起動 sudo service ssh restart

ファイヤーウォール

Fire Wall

次にファイヤーウォールの設定をします。
Ubuntuでは「ufw」というコマンドでファイヤーウォールの設定をします。
Uncomplicated FireWallの頭文字で「簡単にファイヤーウォール設定できるよ」ってコマンドです。

 ファイヤーウォールを設定する 
ファイヤーウォールの状態確認 sudo ufw status ファイヤーウォールをdenyに変更 sudo ufw default deny 80ポート(http)アパッチを解放 sudo ufw allow 80 さっき指定したポートをひらく sudo ufw allow 14681 LIMITを設定する sudo ufw limit 14681 sudo ufw limit 22 指定したポートへのアクセスが30秒で6回失敗すると制限 ファイヤーウォールをアクティブにする sudo ufw enable ファイヤーウォールを最新にアップデート sudo apt-get update アップグレード sudo apt-get upgrade

さらにセキュリティ強化

Enhanced Security

今度は共有メモリのセキュリティを強化します。

 共有メモリ 
sudo vim /etc/fstab 以下を追加 バイナリファイルなどを無効にする tmpfs /dev/shm tmpfs defaults,noexec,nosuid 0 0 保存して閉じる 設定の適用 $ sudo mount -a

通信のセキュリティを強化します。
以下の設定に合わせましょう。

 通信セキュリティ 
$ sudo vim /etc/sysctl.conf 以下を追加して保存 # IP偽装保護 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # ICMPブロードキャストリクエストを無視 net.ipv4.icmp_echo_ignore_broadcasts = 1 # ソースパケットルーティング禁止 net.ipv4.conf.all.accept_source_route = 0 net.ipv6.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv6.conf.default.accept_source_route = 0 # リダイレクト送信を無視 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 # SYN攻撃をブロック net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 5 # Martiansのログ net.ipv4.conf.all.log_martians = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 # ICMPリダイレクトを無視 net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv6.conf.default.accept_redirects = 0 # 直接のpingを無視 net.ipv4.icmp_echo_ignore_all = 1
 リロード 
sudo sysctl -p

IPを偽装してのアクセスを遮断します。
IPなりすまし防止ですね。

 IP偽装防止 
sudo vim /etc/host.conf 以下を追加または編集 order bind,hosts     #文字の並び順に注意 nospoof on

次はPHPのセキュリティを強化します。
こちらも設定を以下に合わせます。

 PHPセキュリティ 
sudo vim /etc/php5/apache2/php.ini 以下を設定(なければ追加) disable_functions = exec,system,shell_exec,passthru,phpinfo register_globals = Off expose_php = Off #phpの情報を見せない設定 display_errors = Off track_errors = Off html_errors = Off magic_quotes_gpc = Off date.timezone = Asia/Tokyo output_buffering = 4096 allow_url_fopen Off allow_url_include Off session.cookie_httponly = 1 (jsでのsession禁止) mbstring.language = Japanese  (言語環境を指定) mbstring.internal_encoding = UTF-8 (内部エンコーディング指定)
 リスタート 
sudo /etc/init.d/apache2 restart または sudo service apach2 restart

apachの情報漏れを防ぎます。
もうちょっとです。頑張ってください!

 情報漏れを防止 
sudo vim /etc/apache2/conf.d/security 以下を設定(なければ追加) ServerTokens Prod ServerSignature Off TraceEnable Off 初期はOFF <ifModule mod_headers.c> Header unset ETag </ifModule> FileETag None リスタート sudo service apache2 restart

apachの言語やエンコードを設定します。
以下の記述に合わせます。

 apach2 
以下を追加または編集 AddLanguage ja .ja (なければ追加) # AddTypeの最後にphpを追加します。 # php AddType application/x-httpd-php .php # cgiスクリプトの拡張子に.pl .cgiを追加します。 現状の記述を「#」でコメントアウトして追記します。 #AddHandler cgi-script .cgi AddHandler cgi-script .cgi .pl
 優先言語 
sudo vim /etc/apache2/mods-available/negotiation.conf 現状の設定を「#」でコメントアウトして、その下に追加 #LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv tr zh-CN zh-TW LanguagePriority ja en ca cs da de el eo es et fr he hr it ko ltz nl nn no pl pt pt-BR ru sv tr zh-CN zh-TW sudo vim /etc/apache2/conf.d/charset utf-8 を指定 ... #AddDefaultCharset UTF-8 AddDefaultCharset UTF-8 ... </IfModule> apacheリスタート sudo service apache2 restart

ここまでくれば本当にもう一息です。
文章が長くて僕が疲れているだけかも知れませんが、UbuntuはCentOSに比べても簡単な方です。
特に、さっきやったファイヤーウォールの設定が劇的に楽です。

仕上げていきます。

Finish

最後にデフォルトサイトの設定と、ちゃんと動くか確認していきましょう。
まずPHPinfoが見れるか確認します。見れたらちゃんと動いてます。
Vimの使い方は慣れたでしょうか?

 PHPinfoを表示 
wwwフォルダにphpファイルを作る sudo vim /var/www/testphp.php エディタが立ち上がったら以下を記述 <?php phpinfo(); ?> vim操作 x  … 削除 cw … 文字の置き換え esc … ノーマルモードに戻る :q! … 保存せず終了 :wq … 保存して終了 ブラウザで確認 数字は仮のIPアドレス(自分のを入れてください) 123.456.78.901/testphp.php (phpinfoが出れば成功)

デフォルトサイトを設定していきます。
よく読んで設定を書き換えるか、現状の設定をコメントアウトして書き足してください。
コメントアウトはコメントアウトしたい行の頭に「#」を付加すると出来ます。

 デフォルトサイト 
sudo vim /etc/apache2/sites-available/default
 設定内容 
<VirtualHost *:80> # serverの管理者メールアドレスを設定します。 #ServerAdmin webmaster@localhost ServerAdmin www@example.com # serverのサーバー名を設定します。 ServerName www.exmaple.com # CentOSなどのデフォルトのホームディレクトリに合わせておきます。 #DocumentRoot /var/www DocumentRoot /var/www <Directory /> Options FollowSymLinks AllowOverride None </Directory> #<Directory /var/www/> <Directory "/var/www/"> # "/var/www/html"ディレクトリ配下では、CGIが実行できるようにします。 #Options Indexes FollowSymLinks MultiViews Options Includes ExecCGI FollowSymLinks # "/var/www/html"ディレクトリ配下では、.htaccess を常に有効にします。 #AllowOverride None AllowOverride All Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>

.htaccessを有効にします。
これをしないとサイト毎の「.htaccess」が効かなくて焦ります。

 .htaccessを有効に 
$ apache2ctl -M $ sudo /usr/sbin/a2enmod rewrite ここでリスタートを促されたらOK リスタートします $ sudo service apache2 restart

これでオッケーです★
今回はこれくらいにしておきます。

最後に…

Comment

Ubuntuのインストール直後にやっておきたい設定は以上になります。
これで安全にサーバーを運営できるはずです。

メールサーバーを構築するとセキュリティの設定がもっとややこしくなります。
次回は頑張ってその辺も書いていこうと思います。

CRONの設定とかLogWatchの導入とか色々書きたい事があるので、是非また読んでください。

もし圧倒的に間違った内容だった場合お問い合わせからご連絡くれると助かります。

あ、でも質問とかは受付ていません。(仕事の依頼は歓迎です)