debian インストール時のメモ

はじめに

このメモは,今運用している鯖が,どっかのCPUベンダの脆弱性対応してくれなくてOSのメジャーバージョン上げないといけないとか,そういうシチュエーションで,毎回調べながらやると時間かかるので,作業内容をメモに残しておくためのものである.

前提

リファレンスになる元サーバがある.
インストールオプションは,基本最小でやったものとする.(sshだけ入れておくと早いかも.EC2ならコンソールエミュレータがないから必須)
クラウド上のVPSにisoイメージからインストールした想定.

やることリスト

ssh login できるようにする

  1. パスワードログインできるようにする.
    1. ポート開放
      1. 22番は内部で使うのはいいけど,外向きには別のポートを使う方がいいよ.ここでは40002とする
        この時,FWは40002のみ開ける
      2. opensshも40002を見るように設定はできるが,次のNAPTを使った方が,後でインスタンスを増やした時とかに内部の設定が楽なので鯖は22をlistenするようにしたままにする.
    2. NAPT系の設定
      1. グローバルIPの40002へのアクセスをインストールしたホスト(ここではdebsvrとする)の22番に飛ばすよう設定する.
    3. opensshが入ってなかったらインストール
  2. 公開鍵認証でログインできるようにする.

    1. 公開鍵をscpでコピーする.scpはポート指定の-Pを後から思い出して最後につけても通らないので注意.

      scp -P 40002 .ssh/id_ed25519.pub user@ipaddr:
      
    2. ついでにクライアントPCからsshを簡単に飛ばせるよう設定しておく

      --- .ssh/config.old
      +++ .ssh/config
      @@ -0,0 +1,4 @@
      + Host debsvr
      +     HostName ipaddr
      +     User user
      +     Port 40002
      

sources.list 更新

  1. sources.list generatorで作る
  2. 以下のパッケージを入れろと言われるので,盲目的に入れる

    apt-get install curl wget apt-transport-https dirmngr
    

不要ソフトの削除

奉仕精神のないダメ人間なので,レポート系は全部消す.
まずパッケージ確認.

dpkg --get-selections | grep port

installation-reportとかレポート系の機能を見付けて消す.ディストリによっては,popularity-contestの場合もある.apport系とかも入ってたら消す.(ubuntuの場合だけかも)

sudo apt-get purge installation-report

必要ソフトのインストール

人に依るけど,私の場合は

sudo apt-get install tmux vim zsh build-essential htop heirloom-mailx 

一部はbackportsから入れる.

sudo apt-get install -t jessie-backports certbot openssl

一部はソースコードから入れる
nginx news

古いサーバがあれば,そのリストと差分を取る方が早い.

dpkg --get-selections>newhost.list; diff oldhost.list newhost.list | less

gitbucket

  1. JDKのインストール

    /etc/apt/sources.list.d/java.list
    deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main
    deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main
    
    sudo apt-get install oracle-java8-installer
    
  2. gitbucketの起動
    インストールは不要.内蔵httpdを使う場合,httpdもいらない.

    wget https://github.com/gitbucket/gitbucket/releases/download/4.22.0/gitbucket.war
    java -jar gitbucket.war
    

なおクライアント側はgitのremoteに新しい鯖を登録するだけ.お手軽.

git remote remove origin
git remote add origin http://IPADDR:8080/path/to/repository.git
git push origin master

nginx

パッケージのnginxが古いのでhttp2が使えなかったりして困るんで自分でソースから入れる.

  1. opensslを1.0.2系にする.あとついでに,いくつかパッチを入れたいので,gitもいれておく.

    sudo apt-get install -t jessie-backports openssl
    sudo apt-get install git
    
  2. nginxのソースを落としてくる.私の場合はstableにするけど,mainlineでも良いと思う.

    wget https://nginx.org/download/nginx-X.XX.X.tar.gz
    
  3. ソースやらパッチの展開.パッチは欲しいものを探すと良い.
    標準でついてるやつで済む場合 (nginx documentation) は,それに留めておいた方が良い.

    mkdir tmp; cd tmp
    tar xzf ../nginx-X.XX.X.tar.gz
    cd nginx-X.XX.X
    git clone https://github.com/openresty/headers-more-nginx-module.git
    git clone https://github.com/arut/nginx-dav-ext-module.git
    
  4. buildの準備
    セキュリティアップデートだったりでbuildし直しは必ずあるので,configureのオプションを書いたシェルスクリプトを作っておいた方が良い.

    configure.sh
    ./configure \
    --prefix=/usr/local/nginx-1.12.2 \
    --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2' \
    --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro' \
    --lock-path=/var/lock/nginx.lock \
    --pid-path=/run/nginx.pid \
    --with-http_ssl_module \
    --with-http_realip_module \
    --with-http_addition_module \
    --with-http_gzip_static_module \
    --with-http_v2_module \
    --with-http_dav_module \
    --add-module=./headers-more-nginx-module \
    --add-module=./nginx-dav-ext-module
    
  5. 足りないと怒られたものを入れるとか,足りないものを入れるとか.

    sudo apt-get install libpcre3-dev
    sudo apt-get install -t jessie-backports libssl-dev
    sudo apt-get install php5 php5-fpm
    sudo apt-get install -t jessie-backports certbot
    sudo apt-get install mariadb
    mysql_secure_installation
    sudo apt-get install -t jessie-backports postgresql
    

    postgresqlは,私はたまたまpostgisの2.3以降が欲しくて,そちらに合わせてbackportsを使うと9.6になるだけで,普通はstableの9.4でも良いんじゃないかと.

    あと普通はmariadbだけで済む.posgresql使うパッケージって少ないよね.

  6. build
    makeに,かなり時間かかるから注意.

    make
    

    多分,buildに失敗するので必要なパッケージを入れる.

    sudo apt-get install libexpat1-dev
    

    makeだけやり直してもいいし,気になるならconfigure.shからやり直してもいい.
    ただしconfigure.shからやり直すとMakefileの日付が新しくなって,compileも全部やり直しなんで注意.
    (コマンド略)

  7. install

    sudo make install
    

    バージョン番号のないディレクトリ構成を作る.

    cd /usr/local/
    sudo ln -s nginx-X.XX.X nginx
    cd /etc
    sudo ln -s /usr/local/nginx/conf nginx
    sudo -s
    cd /var/log
    sudo ln -s /usr/local/nginx/logs nginx
    
  8. 起動スクリプトの準備

    git clone https://github.com/Fleshgrinder/nginx-sysvinit-script.git
    cd nginx-sysvinit-script
    sudo make
    
  9. サービス定義の準備

    /lib/systemd/system/nginx.service
    [Unit]
    Description=The NGINX HTTP and reverse proxy server
    After=syslog.target network.target remote-fs.target nss-lookup.target
    
    [Service]
    Type=forking
    PIDFile=/run/nginx.pid
    ExecStartPre=/usr/local/nginx/sbin/nginx -t
    ExecStart=/usr/local/nginx/sbin/nginx
    ExecStartPost=/bin/sleep 1
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/bin/kill -s QUIT $MAINPID
    PrivateTmp=true
    
    [Install]
    WantedBy=multi-user.target
    
    sudo systemctl unmask nginx.service
    sudo systemctl enable nginx.service
    
  10. テスト

    sudo /usr/local/nginx/sbin/nginx -V
    sudo /usr/local/nginx/sbin/nginx -t
    sudo systemctl list-unit-files --type=service
    sudo systemctl status nginx.service
    
  11. phpとかの設定

    sudo apt-get install php5-mysqlnd php5-pgsql php5-curl
    
    --- php.ini.old
    +++ php.ini
    @@ -390,7 +390,7 @@
    
     ; Maximum amount of memory a script may consume (128MB)
     ; http://php.net/memory-limit
    -memory_limit = 128M
    +memory_limit = 512M
    
     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     ; Error handling and logging ;
    @@ -657,7 +657,7 @@
     ; Its value may be 0 to disable the limit. It is ignored if POST data reading
     ; is disabled through enable_post_data_reading.
     ; http://php.net/post-max-size
    -post_max_size = 8M
    +post_max_size = 0
    
     ; Automatically add files before PHP document.
     ; http://php.net/auto-prepend-file
    @@ -817,7 +817,7 @@
    
     ; Maximum allowed size for uploaded files.
     ; http://php.net/upload-max-filesize
    -upload_max_filesize = 2M
    +upload_max_filesize = 0
    
     ; Maximum number of files that can be uploaded via a single request
     max_file_uploads = 20
    
    /etc/php5/fpm/pool.d/www.conf
    --- www.conf.old
    +++ www.conf
    @@ -106,7 +106,7 @@
     ; forget to tweak pm.* to fit your needs.
     ; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'
     ; Note: This value is mandatory.
    -pm.max_children = 5
    +pm.max_children = 10
    
     ; The number of child processes created on startup.
     ; Note: Used only when pm is set to 'dynamic'
    @@ -366,7 +366,7 @@
     ; Setting to "no" will make all environment variables available to PHP code
     ; via getenv(), $_ENV and $_SERVER.
     ; Default Value: yes
    -;clear_env = no
    +clear_env = no
    
     ; Limits the extensions of the main script FPM will allow to parse. This can
     ; prevent configuration mistakes on the web server side. You should only limit
    
  12. 起動
    問題なさそうなら,起動する.次のどれでも起動するはず.

    # sudo /etc/init.d/nginx start
    # sudo service nginx start
    sudo systemctl start nginx.service
    
  13. dummyパッケージ
    owncloudとか入れようとすると,依存関係でパッケージ管理のhttpd系サービスを入れようとしてくるので,nginxが入ってるよって認識させるためにダミーのパッケージを作ってインストールする.

    まずはequivsを入れる.

    sudo apt-get install equivs
    mkdir ~/tmp/nginx-dummy
    cd ~/tmp/nginx-dummy
    equivs-control nginx-dummy
    

    デフォのnginx-dummyを編集する.

    nginx-dummy
    --- nginx-dummy.old
    +++ nginx-dummy
    @@ -6,14 +6,14 @@
     # Homepage: <enter URL here; no default>
     Standards-Version: 3.9.2
    
    -Package: <package name; defaults to equivs-dummy>
    +Package: nginx-dummy
     # Version: <enter version here; defaults to 1.0>
     # Maintainer: Your Name <yourname@example.com>
     # Pre-Depends: <comma-separated list of packages>
     # Depends: <comma-separated list of packages>
     # Recommends: <comma-separated list of packages>
     # Suggests: <comma-separated list of packages>
    -# Provides: <comma-separated list of packages>
    +Provides: httpd
     # Replaces: <comma-separated list of packages>
     # Architecture: all
     # Copyright: <copyright file; defaults to GPL2>
    @@ -22,7 +22,7 @@
     # Extra-Files: <comma-separated list of additional files for the doc directory>
     # Files: <pair of space-separated paths; First is file to include, second is destination>
     #  <more pairs, if there's more than one file to include. Notice the starting space>
    -Description: <short description; defaults to some wise words>
    - long description and info
    +Description: dummy package for nginx
    + dummy package for nginx installed manually.
      .
    - second paragraph
    + nginx provides httpd
    

    ダミーパッケージのbuild/install.

    equivs-build nginx-dummy
    sudo dpkg -i nginx-dummy_1.0_all.deb
    

nginxの設定

旧鯖からもってくる

certbotで証明書取得

  1. IPアドレスが変更されている場合,DNSの変更を忘れないこと
  2. 秘密鍵の作成(ない場合)

    openssl genrsa -aes256 2048 > server.key
    
  3. 証明書署名要求の作成(ない場合)

    openssl req -new -sha256 -key server.key -out server.csr
    
  4. リクエスト

    sudo certbot certonly --standalone --csr server.csr --config-dir . --logs-dir . --work-dir . -d DOMAINNAME
    

    初回のみ,メールアドレスの入力とライセンスアグリーメントを求められるので入力しておく.
    メールアドレスに証明書の期限切れ通知が来るので,ちゃんと見ているアドレスにした方が良いと思う.

  5. 証明書の配置

    • 0000_cert.pem:証明書本体
    • 0000_chain.pem:trusted_certificateとかに指定するルートCAだか中間証明書だか
    • 0001_chain.pem:上2つの合体したファイル.nginxではこれを使う

    最低限の設定はこんな感じで.

    ssl_certificate /path/to/0001_chain.pem;
    ssl_certificate_key /path/to/private.key;
    
    ssl_dhparam /path/to/dhparam.pem;
    ssl_trusted_certificate /path/to/0000_chain.pem;
    
  6. dhparamの作成

    openssl dhparam 2048 -out dhparam.pem
    
  7. パスフレーズを外す
    ホントはパスフレーズを自動入力するようnginxの起動スクリプトを改造した方が良いのだろうけど(参考:nginx 起動時に秘密鍵のパスフレーズを自動で入力させる)面倒くさいのでパスフレーズを外すことにする.

    mv server.key server.key.org
    openssl rsa -in server.key.org > server.key
    

ちなみに,gitbucketを内蔵httpdを使って動作させておいて,nginxからlocalhost:8080にリバースプロクシすればssl化が簡単.
GitBucketをTomcat8を使用せずにインストール(Nginx使用) - Qiitaに,上のsslの設定あたりを追加すれば動くはず.

あと,sslの設定はGenerate Mozilla Security Recommended Web Server Configuration Filesを使う方が正確だと思われ.

mariadbの設定

/etc/mysql/conf.d/mariadb.cnf
--- a/conf.d/mariadb.cnf
+++ b/conf.d/mariadb.cnf
@@ -11,7 +11,16 @@
 #
 # Default is Latin1, if you need UTF-8 set all this (also in client section)
 #
-#character-set-server  = utf8
-#collation-server      = utf8_general_ci
-#character_set_server   = utf8
-#collation_server       = utf8_general_ci
+character-set-server  = utf8
+collation-server      = utf8_general_ci
+character_set_server   = utf8
+collation_server       = utf8_general_ci
+default-storage-engine = innodb
+default_storage_engine = innodb
+innodb-file-format     = Barracuda
+innodb_file_format     = Barracuda
+innodb-file-per-table  = 1
+innodb_file_per_table  = 1
+innodb-use-sys-malloc  = 0
+innodb_use_sys_malloc  = 0
+skip-character-set-client-handshake
sudo systemctl restart mysql.service

取り込み.

createuser.sql
GRANT ALL PRIVILEGES ON database.* TO username@localhost IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
mysql -u root -p < createuser.sql
export MYSQL_PWD=password
mysql -e 'CREATE DATABASe database'
mysql database < backup.sql

wordpressみたいなDB依存ソフトの書き換えなど行なって,一部www-dataが書き込みする場所のパーミッション修正.


以下,予定.書かないかも.

個人設定

個人の好みなのでどーでもいいけど,この辺りをやる.

.zsh
.zshenv
.vimrc
.vim/bundle
git clone https://github.com/Shougo/neobundle.vim
.dir_colors
.tmux.conf
chsh

owncloud

.s3cfg

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.