CINXE.COM

Ubuntu 24.04 LTS サーバ構築手順書

<!DOCTYPE html> <html lang="ja"> <head prefix="og: http://ogp.me/ns#"> <meta charset="UTF-8" /> <title>Ubuntu 24.04 LTS サーバ構築手順書</title> <meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="format-detection" content="telephone=no, email=no, address=no" /> <meta name="description" content="Ubuntu LTS を用いたサーバ構築手順書です" /> <meta property="og:title" content="Ubuntu 24.04 LTS サーバ構築手順書" /> <meta property="og:site_name" content="lavoscore.org" /> <meta property="og:url" content="https://server.lavoscore.org/" /> <meta property="og:description" content="Ubuntu LTS を用いたサーバ構築手順書です" /> <meta property="og:type" content="website" /> <meta property="og:image" content="https://server.lavoscore.org/assets/img/og.png" /> <meta name="twitter:card" content="summary_large_image" /> <link rel="stylesheet" href="/assets/css/reset.css?1645589764" /> <link rel="stylesheet" href="/assets/css/style.css?1731336621" /> <script src="/assets/js/script.js?1703766639"></script> <script src="https://lavoscore.org/analytics.js"></script> </head> <body> <div id="page-container"> <header id="page-header"> <div class="siteArea"> <h1 class="heading"><a href="/"><img src="/assets/img/logo.png" width="480" height="130" alt="Ubuntu LTS サーバ構築手順書" /></a></h1> <ul class="siteInfo"> <li class="author">文責: <a href="https://twitter.com/debiru_R">@debiru_R</a></li> <li class="created_at">作成日: 2023年12月25日</li> <li class="created_at">更新日: 2024年6月30日</li> <li class="license">この文書のライセンス: <a href="https://www.kmonos.net/nysl/">NYSL 0.9982</a></li> <li class="hatena-bookmark"> <a href="https://b.hatena.ne.jp/entry/s/server.lavoscore.org/" class="hatena-bookmark-button" data-hatena-bookmark-layout="vertical-normal" data-hatena-bookmark-lang="ja" title="このエントリーをはてなブックマークに追加"><img src="https://b.st-hatena.com/images/v4/public/entry-button/button-only@2x.png" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;" /></a><script type="text/javascript" src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script> </li> </ul> </div> <form id="queryForm" action="./" method="get"> <ul class="control"> <li><label><span class="label">OSユーザ名</span><input type="text" name="name" value="yourname" /></label></li> <li><label><span class="label">ドメイン名</span><input type="text" name="domain" value="example.org" /></label></li> <li><label><span class="label">IPアドレス</span><input type="text" name="ip" value="203.0.113.123" /></label></li> <li><label><span class="label">さくらホスト名</span><input type="text" name="sakura" value="www99999ui" /></label></li> <li><label><span class="label">追加ドメイン名</span><input type="text" name="another_domain" value="example.net" /></label></li> <li><label><span class="label">Your Email</span><input type="text" name="email" value="yourmail@example.jp" /></label></li> <li><button type="submit">Update</button></li> </ul> </form> </header> <main id="page-main"> <h1 id="id-1"><a href="#id-1" data-id="1">§</a><span class="heading">まえがき</span></h1> <p>この文書は、2024年時点の作業内容をまとめたものです。</p> <ul> <li>VPS サーバに Ubuntu 24.04 LTS をインストールして Web サーバを立てる。</li> <li>さくら 1G サーバを想定していたが、メモリ不足による問題が顕著になってきたので 4G プラン(メモリ 4GB)を想定するものとする。</li> <li>サーバの IP は 203.0.113.123 とする。(<a href="http://tools.ietf.org/html/rfc6890#page-12">例示用 IP</a>)</li> <li>割り当てるドメイン名は example.org とする。(<a href="https://tools.ietf.org/html/rfc2606#page-3">例示用ドメイン名</a>)</li> </ul> <h2 id="id-1-1"><a href="#id-1-1" data-id="1-1">§</a><span class="heading">サーバで提供される機能一覧</span></h2> <h3 id="id-1-1-1"><a href="#id-1-1-1" data-id="1-1-1">§</a><span class="heading">1. 公開鍵認証での SSH 接続</span></h3> <p>パスワード認証でのログインを禁止します。</p> <h3 id="id-1-1-2"><a href="#id-1-1-2" data-id="1-1-2">§</a><span class="heading">2. Emacs の導入</span></h3> <p>Emacs を利用した手順書になっています。</p> <h3 id="id-1-1-3"><a href="#id-1-1-3" data-id="1-1-3">§</a><span class="heading">3. RDBMS の導入</span></h3> <p>MySQL 最新版を使える状態にします。</p> <h3 id="id-1-1-4"><a href="#id-1-1-4" data-id="1-1-4">§</a><span class="heading">4. 各種プログラミング言語の導入</span></h3> <p>C, C++, Java, Perl, PHP, Ruby, Python, Go, Node を使える状態にします。</p> <h3 id="id-1-1-5"><a href="#id-1-1-5" data-id="1-1-5">§</a><span class="heading">5. Apache - HTTP/HTTPS の応答</span></h3> <p>Apache 最新版で HTTP/HTTPS を応答します。</p> <p>VirtualHost でサブドメインに対応する URL の展開を容易にします。</p> <p>SNI で複数のドメイン名に対する HTTPS の提供を可能にします。</p> <h3 id="id-1-1-6"><a href="#id-1-1-6" data-id="1-1-6">§</a><span class="heading">6. Let's Encrypt / tinydns の導入</span></h3> <p>Let's Encrypt の SSL サーバ証明書を自動発行できるようにします。</p> <p>tinydns で権威 DNS サーバを構築し、DNS-01 チャレンジを可能にします。</p> <p>ワイルドカード証明書の自動発行が可能になります。</p> <h3 id="id-1-1-7"><a href="#id-1-1-7" data-id="1-1-7">§</a><span class="heading">7. Postfix の導入</span></h3> <p>メールの送信処理に対応します。</p> <p>独自ドメイン名でのメールの受信(転送)処理に対応します。</p> <h1 id="id-2"><a href="#id-2" data-id="2">§</a><span class="heading">DNS RRs の設定</span></h1> <table> <thead> <tr> <th style="text-align: center;">host</th> <th style="text-align: center;">type</th> <th style="text-align: center;">value</th> </tr> </thead> <tbody> <tr> <td style="text-align: center;">example.org</td> <td style="text-align: center;">A</td> <td style="text-align: center;">203.0.113.123</td> </tr> <tr> <td style="text-align: center;">*.example.org</td> <td style="text-align: center;">A</td> <td style="text-align: center;">203.0.113.123</td> </tr> <tr> <td style="text-align: center;">example.org</td> <td style="text-align: center;">MX</td> <td style="text-align: center;">10 mx.example.org</td> </tr> <tr> <td style="text-align: center;">example.org</td> <td style="text-align: center;">TXT</td> <td style="text-align: center;">v=spf1 +mx -all</td> </tr> <tr> <td style="text-align: center;">example.org</td> <td style="text-align: center;">CAA</td> <td style="text-align: center;">0 issue &quot;letsencrypt.org&quot;<br>0 issuewild &quot;letsencrypt.org&quot;<br>0 iodef &quot;mailto:yourmail@example.jp&quot;</td> </tr> <tr> <td style="text-align: center;">_acme-challenge.example.org</td> <td style="text-align: center;">NS</td> <td style="text-align: center;">ns.example.org</td> </tr> </tbody> </table> <h1 id="id-3"><a href="#id-3" data-id="3">§</a><span class="heading">OS再インストール</span></h1> <ul> <li>初期設定で期待通りの設定ができていない場合は、OSの再インストールをする。</li> <li>さくらVPSのコントロールパネルから、OSを再インストールするサーバを選ぶ。</li> </ul> <pre><code class="language-output">www99999ui.vs.sakura.ne.jp</code></pre> <h2 id="id-3-1"><a href="#id-3-1" data-id="3-1">§</a><span class="heading">OSのインストール操作</span></h2> <ul> <li>Ubuntu 24.04 LTS を選ぶ。</li> <li>OSインストール時のパケットフィルタ(ポート制限)を無効にして、ファイアウォールは手動で設定することにする。</li> <li>初期ユーザのパスワードに使える文字が制限されているので、ここでは簡単なパスワードにしておき、後ですぐに複雑なパスワードに変更する。</li> <li>公開鍵認証できるように公開鍵を登録しておく。</li> </ul> <h3 id="id-3-1-1"><a href="#id-3-1-1" data-id="3-1-1">§</a><span class="heading">秘密鍵と公開鍵の作成</span></h3> <ul> <li>クライアントマシン側で生成した公開鍵を ~/.ssh/authorized_keys に設置すれば公開鍵認証が可能になる。</li> <li>クライアント側では次のようなコマンドで秘密鍵と公開鍵を生成できる。</li> </ul> <pre><code class="language-sh">ssh-keygen -t ed25519 -C 'yourmail@example.jp'</code></pre> <h2 id="id-3-2"><a href="#id-3-2" data-id="3-2">§</a><span class="heading">サーバ起動</span></h2> <ul> <li>コンパネからサーバを起動する。</li> </ul> <h1 id="id-4"><a href="#id-4" data-id="4">§</a><span class="heading">ssh アクセスする</span></h1> <pre><code class="language-sh">ssh ubuntu@203.0.113.123</code></pre> <pre><code class="language-sh">// sudo のパスワードを通しておく sudo ls</code></pre> <ul> <li>早速、パスワードを複雑なものに設定しておく。</li> </ul> <pre><code class="language-sh">passwd</code></pre> <h1 id="id-5"><a href="#id-5" data-id="5">§</a><span class="heading">ユーザ作成</span></h1> <ul> <li>OSのユーザ名に ubuntu 以外を使いたいので、別のユーザを作成する。</li> </ul> <pre><code class="language-sh">sudo adduser yourname // input password sudo gpasswd -a yourname sudo sudo gpasswd -a yourname adm</code></pre> <ul> <li>クライアント側の <code>~/.ssh/config</code> に追記する。</li> </ul> <pre><code class="language-file">Host yourname HostName 203.0.113.123 User yourname IdentityFile ~/.ssh/id_ed25519</code></pre> <h2 id="id-5-1"><a href="#id-5-1" data-id="5-1">§</a><span class="heading">公開鍵認証の設定</span></h2> <pre><code class="language-sh">sudo cp -r /home/ubuntu/.ssh /home/yourname/.ssh sudo chown -R yourname:yourname /home/yourname/.ssh</code></pre> <ul> <li>以後は yourname で作業する。</li> </ul> <h1 id="id-6"><a href="#id-6" data-id="6">§</a><span class="heading">apt 更新</span></h1> <pre><code class="language-sh">sudo apt update sudo apt list --upgradable sudo apt upgrade</code></pre> <ul> <li>必要があればサーバを再起動する。</li> </ul> <pre><code class="language-sh">sudo reboot</code></pre> <h2 id="id-6-1"><a href="#id-6-1" data-id="6-1">§</a><span class="heading">apt コマンド</span></h2> <pre><code class="language-opt">// パッケージ検索 apt search PACKAGE // インストール済みパッケージ検索 dpkg -l // インストール apt -y install PACKAGE // アンインストール(purge は環境設定、auto-remove は依存パッケージ含む) apt purge --auto-remove PACKAGE</code></pre> <h1 id="id-7"><a href="#id-7" data-id="7">§</a><span class="heading">emacs 設定</span></h1> <pre><code class="language-sh">sudo apt -y install emacs mkdir ~/.emacs.d curl -fsSL https://server.lavoscore.org/file/emacs/init.el -o ~/.emacs.d/init.el // 一度 Emacs を開く emacs ~/.emacs.d/init.el // Emacs を抜ける</code></pre> <pre><code class="language-file">;; UTF-8 として扱う ;; prefer-coding-system は使わないことにする ;; https://github.com/takueof/.emacs.d/blob/master/init.el ; (prefer-coding-system 'utf-8) ; (setq coding-system-for-read 'utf-8) ; (setq coding-system-for-write 'utf-8) (set-language-environment "Japanese") (set-coding-system-priority 'utf-8) (setq-default buffer-file-coding-system 'utf-8-unix) ;; macOS ONLY (when (member system-type '(darwin)) (set-keyboard-coding-system 'utf-8-unix) (set-selection-coding-system 'utf-8) (set-terminal-coding-system 'utf-8) (setq-default default-process-coding-system '(utf-8 . utf-8))) ;; emacs の自動バックアップによる ~ 付きのファイル生成を止める (setq backup-inhibited t) (setq delete-auto-save-files t) ;; インデントをソフトタブにする (setq-default indent-tabs-mode nil) (setq lisp-indent-offset 2) ;; シンボリックリンクの読み込みを許可 (setq vc-follow-symlinks t) ;; シンボリックリンク先のVCS内で更新が入った場合にバッファを自動更新 (setq auto-revert-check-vc-info t) ;; 空白類文字の可視化 (require 'whitespace) (set-face-foreground 'whitespace-space "#ccc") (set-face-background 'whitespace-space nil) (set-face-bold-p 'whitespace-space t) (set-face-foreground 'whitespace-tab "#333") (set-face-background 'whitespace-tab nil) (set-face-underline 'whitespace-tab t) (setq whitespace-style '(face tabs tab-mark spaces space-mark)) (setq whitespace-space-regexp "\\(\x3000+\\)") (setq whitespace-display-mappings '((space-mark ?\x3000 [?\□]) (tab-mark ?\t [?\xBB ?\t]) )) (global-whitespace-mode 1) ;; 全角スペースを常に表示 (setq-default show-trailing-whitespace t) ;; 末尾のスペースを表示 ;; emacs に行番号を表示する (require 'linum) (global-linum-mode t) (setq linum-format "%4d: ") (column-number-mode t) (line-number-mode t) ;; f6 で行番号表示をトグルする (global-set-key (kbd "&lt;f6&gt;") 'linum-mode) ;; [Ctrl + q] &lt;tab&gt; でハードタブを入力できるようにする (global-set-key (kbd "&lt;backtab&gt;") (kbd "C-q &lt;tab&gt;")) ;; [Ctrl + z] で矩形選択編集を可能にする (cua-mode t) (setq cua-enable-cua-keys nil) (global-set-key (kbd "C-z") 'cua-set-rectangle-mark) ;; M-x package-list-packages ;; M-x package-install PACKAGE_NAME ;; https://stackoverflow.com/questions/10092322/how-to-automatically-install-emacs-packages-by-specifying-a-list-of-package-name#10093312 ;; list the repositories containing them (setq package-archives '(("melpa-stable" . "https://stable.melpa.org/packages/"))) ;; activate all the packages (in particular autoloads) (package-initialize) ;; list the packages you want (setq package-list '(editorconfig web-mode)) ;; fetch the list of packages available (unless package-archive-contents (package-refresh-contents)) ;; install the missing packages (dolist (package package-list) (unless (package-installed-p package) (package-install package))) ;; M-x package-install editorconfig (require 'editorconfig) (editorconfig-mode 1) ;; M-x package-install web-mode (require 'web-mode) (add-to-list 'auto-mode-alist '("\\.php\\'" . web-mode)) (add-to-list 'auto-mode-alist '("\\.html\\'" . web-mode)) ;; web-mode で混在する言語のインデントを調整する (defun my-web-mode-hook () "Hooks for Web mode." (setq web-mode-markup-indent-offset 2) (setq web-mode-css-indent-offset 2) (setq web-mode-code-indent-offset 2) (setq web-mode-attr-indent-offset 0) (setq web-mode-block-padding 0) ) (add-hook 'web-mode-hook 'my-web-mode-hook) ;; php-mode のインデントを調整する (add-hook 'php-mode-hook (lambda () (c-set-offset 'case-label' c-basic-offset) (c-set-offset 'arglist-intro' c-basic-offset) (c-set-offset 'arglist-cont-nonempty' c-basic-offset) (c-set-offset 'arglist-close' 0) )) ;; web-mode でのカラーリング (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(web-mode-comment-face ((t (:foreground "#ff0000")))) '(web-mode-doctype-face ((t (:foreground "#808099")))) '(web-mode-function-call-face ((t (:foreground "#60ccff")))) '(web-mode-function-name-face ((t (:foreground "#60ccff")))) '(web-mode-html-attr-equal-face ((t (:foreground "#ffffff")))) '(web-mode-html-attr-name-face ((t (:foreground "#b07000")))) '(web-mode-html-attr-value-face ((t (:foreground "#ff0066")))) '(web-mode-html-tag-bracket-face ((t (:foreground "#ffffff")))) '(web-mode-html-tag-face ((t (:foreground "#60ccff"))))) (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(package-selected-packages '(editorconfig web-mode)))</code></pre> <pre><code class="language-sh">// rootにも設置する sudo -i mkdir ~/.emacs.d ln -s /home/yourname/.emacs.d/init.el ~/.emacs.d/ // 一度 Emacs を開く emacs ~/.emacs.d/init.el // Emacs を抜ける // root を抜ける exit</code></pre> <pre><code class="language-sh">sudo update-alternatives --config editor // 3 (emacs) など好きなエディタを選択する</code></pre> <h1 id="id-8"><a href="#id-8" data-id="8">§</a><span class="heading">.editorconfig の設置</span></h1> <pre><code class="language-sh">sudo curl -fsSL https://server.lavoscore.org/file/editorconfig.txt -o /.editorconfig</code></pre> <pre><code class="language-file"># 上位ディレクトリの EditorConfig を無視する場合は true root = true [*] charset = utf-8 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true [*.html] indent_style = space indent_size = 2 [*.php] indent_style = space indent_size = 2 [*.{css,scss}] indent_style = space indent_size = 2 [*.js] indent_style = space indent_size = 2</code></pre> <h1 id="id-9"><a href="#id-9" data-id="9">§</a><span class="heading">.profile 記述</span></h1> <pre><code class="language-sh">emacs ~/.profile // ファイル末尾に以下の内容を追記する</code></pre> <pre><code class="language-file"># [dir =&gt; Cyan, ln =&gt; Yellow, or =&gt; Blink-Red, mi =&gt; Blink-Red] # or = Orphaned symlink (symlinkFrom), mi = Missing file (symlinkTo; displayed by `ls -l`) # refs: `dircolors` or `man dir_colors` export LS_COLORS="${LS_COLORS}di=01;36:ln=01;33:or=01;05;37;41:mi=01;05;37;41:" # "\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ " PS1="\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;35m\]\w\[\033[00m\]\$ " PATH="$HOME/bin:$HOME/.local/bin:$PATH" alias s='ls' alias sl='ls' alias qls='ls' alias qll='ll' alias qgit='git' alias emasc='emacs' # https://orangeclover.hatenablog.com/entry/20110201/1296511181 alias clear2="echo -e '\026\033c'"</code></pre> <pre><code class="language-sh">// 一度ターミナルを抜けて、入り直す exit</code></pre> <h1 id="id-10"><a href="#id-10" data-id="10">§</a><span class="heading">git 設定</span></h1> <ul> <li>git はデフォルトでインストールされている。</li> </ul> <pre><code class="language-sh">emacs ~/.gitconfig</code></pre> <pre><code class="language-file">[user] name = yourname email = yourname@example.org [color] diff = auto status = auto branch = auto interactive = auto ui = auto [alias] co = checkout st = status di = diff diw = diff --color-words='[[:alnum:]]+|[^[:space:]]' push-reset = push -f origin HEAD:master amend = commit --amend pick = cherry-pick dic = diff --cached ls = ls-files up-assume = update-index --assume-unchanged up-no-assume = update-index --no-assume-unchanged up-skip = update-index --skip-worktree up-no-skip = update-index --no-skip-worktree [core] pager = less -+S [push] default = simple</code></pre> <pre><code class="language-sh">// root にも設置する sudo ln -s /home/yourname/.gitconfig /root</code></pre> <pre><code class="language-sh">cd /etc sudo emacs .gitignore // 以下の内容を .gitignore ファイルに記述する</code></pre> <pre><code class="language-file">.gitignore /letsencrypt/ /tinydns/ /_tinydns/ /_ucspi-tcp/</code></pre> <pre><code class="language-sh">sudo git init . sudo git add . sudo git commit -m "first commit"</code></pre> <h1 id="id-11"><a href="#id-11" data-id="11">§</a><span class="heading">システムロケール</span></h1> <pre><code class="language-sh">sudo apt -y install language-pack-ja manpages-ja</code></pre> <pre><code class="language-opt">locale -a</code></pre> <pre><code class="language-output">C C.UTF-8 POSIX ja_JP.utf8</code></pre> <pre><code class="language-opt">locale</code></pre> <pre><code class="language-output">LANG=C.UTF-8 LANGUAGE= LC_CTYPE="C.UTF-8" LC_NUMERIC="C.UTF-8" LC_TIME="C.UTF-8" LC_COLLATE="C.UTF-8" LC_MONETARY="C.UTF-8" LC_MESSAGES="C.UTF-8" LC_PAPER="C.UTF-8" LC_NAME="C.UTF-8" LC_ADDRESS="C.UTF-8" LC_TELEPHONE="C.UTF-8" LC_MEASUREMENT="C.UTF-8" LC_IDENTIFICATION="C.UTF-8" LC_ALL=</code></pre> <h1 id="id-12"><a href="#id-12" data-id="12">§</a><span class="heading">/etc/hostname 設定</span></h1> <ul> <li>hostname には FQDN ではなくホスト名(ラベル)を設定する。(<a href="https://www.debian.org/doc/manuals/debian-reference/ch03.en.html#_the_hostname">Chapter 3. The system initialization</a>)</li> </ul> <pre><code class="language-sh">sudo emacs /etc/hostname</code></pre> <pre><code class="language-file">example</code></pre> <pre><code class="language-sh">sudo emacs /etc/hosts // 以下の 3 行目を追加する</code></pre> <pre><code class="language-file">127.0.0.1 localhost 127.0.1.1 www99999ui.vs.sakura.ne.jp www99999ui 203.0.113.123 example.org example # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters</code></pre> <pre><code class="language-sh">cd /etc sudo git add . sudo git commit -m "/etc/host*"</code></pre> <ul> <li>上記の設定ファイルを書き換えたらサーバを再起動する。</li> </ul> <pre><code class="language-sh">sudo reboot</code></pre> <ul> <li>数秒後に再起動が完了するので再度 ssh で接続して設定が反映されているかを確認する。 <ul> <li>ログインシェルの冒頭の <code>yourname@example:~$</code> のような部分を見れば hostname が確認できる。</li> </ul></li> </ul> <h2 id="id-12-1"><a href="#id-12-1" data-id="12-1">§</a><span class="heading">公開鍵認証を可能にする</span></h2> <p>クライアントマシン側で生成した公開鍵を <code>~/.ssh/authorized_keys</code> に設置すれば公開鍵認証が可能になる。</p> <p>クライアント側では次のようなコマンドで秘密鍵と公開鍵を生成できる。</p> <pre><code class="language-opt">ssh-keygen -t ed25519 -C 'yourmail@example.jp'</code></pre> <p>RSA 2048 bit 鍵でもよいが、Ed25519 鍵が使える環境であれば Ed25519 鍵を使いたい。</p> <p>クライアント側では <code>~/.ssh/id_rsa</code> や <code>~/.ssh/id_ed25519</code> などがあれば自動的にそれが使われるが、明示的に使いたい場合は <code>ssh -i /path/to/id_ed25519</code> のようにオプションを付与して秘密鍵のパスを指定するか、次のように <code>~/.ssh/config</code> ファイルを記述すればよい。</p> <pre><code class="language-file">Host example.org HostName 203.0.113.123 User yourname IdentityFile ~/.ssh/id_ed25519</code></pre> <h1 id="id-13"><a href="#id-13" data-id="13">§</a><span class="heading">ファイアウォールを有効にする</span></h1> <pre><code class="language-sh">sudo ufw status numbered sudo ufw default deny sudo ufw allow ftp sudo ufw allow ssh sudo ufw allow http sudo ufw allow https sudo ufw allow domain sudo ufw enable // enable really? [y/n] sudo ufw status numbered</code></pre> <pre><code class="language-sh">cd /etc sudo git add . sudo git commit -m "ufw"</code></pre> <ul> <li><code>sudo ufw status numbered</code> で開放中のポートのルールを(ルール番号付きで)確認できる。</li> <li>ルールを削除したい場合: <ul> <li><code>sudo ufw delete allow http</code> で allow http のルールを削除できる。</li> <li><code>sudo ufw delete 123</code> でルール番号 123 のルールを削除できる。</li> </ul></li> <li>何らかの変更を加えた後は <code>$ sudo ufw reload</code> で変更を反映する。</li> </ul> <h1 id="id-14"><a href="#id-14" data-id="14">§</a><span class="heading">ミドルウェア</span></h1> <pre><code class="language-sh">sudo apt -y install apache2 sudo apt -y install mysql-server sudo apt -y install build-essential libssl-dev libreadline-dev zlib1g-dev libffi-dev libyaml-dev sudo add-apt-repository ppa:ondrej/php sudo apt update sudo apt -y install php8.4 sudo apt -y install php8.4-mysql php8.4-curl php8.4-gd php8.4-mbstring php8.4-xml php8.4-intl php8.4-imagick php8.4-zip php8.4-bcmath php8.4-dev sudo apt -y install silversearcher-ag tree imagemagick zip</code></pre> <pre><code class="language-sh">sudo apt list --upgradable sudo apt upgrade sudo reboot</code></pre> <pre><code class="language-sh">cd /etc sudo git add . sudo git commit -m "middleware installed"</code></pre> <ul> <li><a href="https://getcomposer.org/download/">https://getcomposer.org/download/</a></li> </ul> <pre><code class="language-sh">cd ~ emacs getcomposer.sh</code></pre> <pre><code class="language-file">#!/bin/sh EXPECTED_CHECKSUM="$(php -r 'copy("https://composer.github.io/installer.sig", "php://stdout");')" php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" ACTUAL_CHECKSUM="$(php -r "echo hash_file('sha384', 'composer-setup.php');")" if [ "$EXPECTED_CHECKSUM" != "$ACTUAL_CHECKSUM" ] then &gt;&amp;2 echo 'ERROR: Invalid installer checksum' rm composer-setup.php exit 1 fi php composer-setup.php --quiet RESULT=$? rm composer-setup.php exit $RESULT</code></pre> <pre><code class="language-sh">chmod +x getcomposer.sh ./getcomposer.sh rm getcomposer.sh mkdir ~/bin mv composer.phar ~/bin/composer</code></pre> <h2 id="id-14-1"><a href="#id-14-1" data-id="14-1">§</a><span class="heading">Java</span></h2> <pre><code class="language-sh">sudo apt install openjdk-21-jdk cd /etc sudo git add . sudo git commit -m "java"</code></pre> <h2 id="id-14-2"><a href="#id-14-2" data-id="14-2">§</a><span class="heading">Ruby</span></h2> <pre><code class="language-sh">git clone https://github.com/rbenv/rbenv.git ~/.rbenv git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build cd ~ emacs .profile</code></pre> <pre><code class="language-file"># https://qiita.com/kerupani129/items/77dd1e3390b53f4e97b2 export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init -)"</code></pre> <pre><code class="language-sh">// 一度ターミナルを抜けて、入り直す exit</code></pre> <pre><code class="language-sh">// インストール可能な Ruby のバージョンを確認 rbenv install -l // メモリが十分あれば、2分程度で最新版がインストールできる // 4GB あれば十分だが、もしかしたら 2GB でも足りるかもしれない rbenv install 3.x.y rbenv global 3.x.y rbenv rehash // 以下は、さくら 1G で Ubuntu 24.04 に ruby をインストールする手順 // 3.2.x, 3.3.x はメモリ不足でインストールに失敗するので // 3.1.x をインストールする(インストールには 50 分近くかかるので注意) // メモリが少ないので -j1 で並列処理をさせないようにしておく // --disable-install-doc でドキュメントの生成をしないようにする // ログは /tmp/ruby-build.20240630232944.38582.log のようなファイルで確認できる MAKEOPTS="-j1" CONFIGURE_OPTS="--disable-install-doc" time rbenv install 3.1.x rbenv global 3.1.x rbenv rehash</code></pre> <h3 id="id-14-2-1"><a href="#id-14-2-1" data-id="14-2-1">§</a><span class="heading">gem</span></h3> <ul> <li>必要があれば好きなものを入れる。</li> </ul> <pre><code class="language-sh">gem update --system</code></pre> <h2 id="id-14-3"><a href="#id-14-3" data-id="14-3">§</a><span class="heading">python</span></h2> <pre><code class="language-sh">ln -s /usr/bin/python3 ~/bin/python</code></pre> <h2 id="id-14-4"><a href="#id-14-4" data-id="14-4">§</a><span class="heading">go</span></h2> <pre><code class="language-sh">git clone https://github.com/syndbg/goenv.git ~/.goenv emacs ~/.profile</code></pre> <pre><code class="language-file"># https://qiita.com/locomotive/items/1c9461dc059b663b022f # https://github.com/sonots/lltsv export GOENV_ROOT=$HOME/.goenv export PATH=$GOENV_ROOT/bin:$PATH eval "$(goenv init -)"</code></pre> <pre><code class="language-sh">// 一度ターミナルを抜けて、入り直す exit</code></pre> <pre><code class="language-sh">goenv install -l goenv install 1.xx.yy goenv versions goenv global 1.xx.yy goenv rehash</code></pre> <pre><code class="language-sh">go install github.com/sonots/lltsv@latest</code></pre> <h2 id="id-14-5"><a href="#id-14-5" data-id="14-5">§</a><span class="heading">node</span></h2> <pre><code class="language-sh">git clone https://github.com/nodenv/nodenv.git ~/.nodenv emacs ~/.profile</code></pre> <pre><code class="language-file"># https://qiita.com/masakuni-ito/items/1ea015eea03ef4b95c72 # https://hodalog.com/nodenv-install-no-such-command/ export PATH="$HOME/.nodenv/bin:$PATH" eval "$(nodenv init -)"</code></pre> <pre><code class="language-sh">// 一度ターミナルを抜けて、入り直す exit</code></pre> <pre><code class="language-sh">// このままでは nodenv install コマンドがないので node-build を入れる mkdir -p "$(nodenv root)"/plugins git clone https://github.com/nodenv/node-build.git "$(nodenv root)"/plugins/node-build nodenv install -l nodenv install *** nodenv versions nodenv global *** nodenv rehash</code></pre> <h1 id="id-15"><a href="#id-15" data-id="15">§</a><span class="heading">php.ini の設定</span></h1> <pre><code class="language-sh">sudo emacs /etc/php/8.4/apache2/php.ini</code></pre> <pre><code class="language-diff"> ; Maximum amount of memory a script may consume ; https://php.net/memory-limit -memory_limit = 128M +memory_limit = 256M ;;changed ; Its value may be 0 to disable the limit. It is ignored if POST data reading ; is disabled through enable_post_data_reading. ; https://php.net/post-max-size -post_max_size = 8M +post_max_size = 64M ;;changed ; Maximum allowed size for uploaded files. ; https://php.net/upload-max-filesize -upload_max_filesize = 2M +upload_max_filesize = 64M ;;changed ; Maximum number of files that can be uploaded via a single request -max_file_uploads = 20 +max_file_uploads = 128 ;;changed [Date] ; Defines the default timezone used by the date functions ; https://php.net/date.timezone -;date.timezone = +date.timezone = Asia/Tokyo ;;changed</code></pre> <pre><code class="language-sh">sudo emacs /etc/php/8.4/cli/php.ini</code></pre> <pre><code class="language-diff"> [Date] ; Defines the default timezone used by the date functions ; https://php.net/date.timezone -;date.timezone = +date.timezone = Asia/Tokyo ;;changed</code></pre> <pre><code class="language-sh">cd /etc sudo git add . sudo git commit -m "php.ini"</code></pre> <h1 id="id-16"><a href="#id-16" data-id="16">§</a><span class="heading">MySQL</span></h1> <h2 id="id-16-1"><a href="#id-16-1" data-id="16-1">§</a><span class="heading">MySQL 実行時のメモリ使用量を制限する</span></h2> <ul> <li>メモリが少ない場合は、MySQL が実行時メモリ不足で自動的にプロセスを停止させてしまうので、メモリ使用量を制限しておく</li> </ul> <pre><code class="language-sh">sudo emacs /etc/mysql/mysql.conf.d/mysqld.cnf</code></pre> <pre><code class="language-diff"> # The following values assume you have at least 32M ram [mysqld] +table_definition_cache=400 + # # * Basic Settings #</code></pre> <pre><code class="language-sh">cd /etc sudo git add . sudo git commit -m "mysqld.cnf"</code></pre> <h2 id="id-16-2"><a href="#id-16-2" data-id="16-2">§</a><span class="heading">MySQL を起動する</span></h2> <pre><code class="language-sh">mysql --version sudo systemctl enable mysql systemctl status mysql sudo mysql -u root</code></pre> <h2 id="id-16-3"><a href="#id-16-3" data-id="16-3">§</a><span class="heading">MySQL 一般ユーザを作成する</span></h2> <ul> <li>MySQL ユーザのパスワードは適切なものを設定する。</li> </ul> <pre><code class="language-mysql">// ユーザを作成する mysql&gt; CREATE USER mysqluser@localhost IDENTIFIED by 'YOUR_DB_PASSWORD'; // 権限を与える mysql&gt; GRANT ALL PRIVILEGES ON *.* TO mysqluser@localhost; // MySQL を抜ける mysql&gt; quit</code></pre> <h3 id="id-16-3-1"><a href="#id-16-3-1" data-id="16-3-1">§</a><span class="heading">権限を外す場合</span></h3> <pre><code class="language-opt">// 権限を外す mysql&gt; REVOKE ALL PRIVILEGES ON *.* FROM mysqluser@localhost; // 特定の DB のみに権限を与える場合 // この例では proj_ を接頭辞に持ち、その後ろに少なくとも 1 文字以上を持つ DB への権限が与えられる // LIKE 句と同様に、ワイルドカード _ は任意の1文字であり % は任意の 0 文字以上の意味を持つ mysql&gt; GRANT ALL PRIVILEGES ON `proj\__%`.* TO mysqluser@localhost;</code></pre> <h3 id="id-16-3-2"><a href="#id-16-3-2" data-id="16-3-2">§</a><span class="heading">存在するユーザの権限確認</span></h3> <pre><code class="language-opt">mysql&gt; SELECT Host, User FROM mysql.user; mysql&gt; SELECT * FROM mysql.user\G mysql&gt; SELECT * FROM mysql.db\G</code></pre> <h3 id="id-16-3-3"><a href="#id-16-3-3" data-id="16-3-3">§</a><span class="heading">全データベースのバックアップとリストア</span></h3> <pre><code class="language-opt">mysqldump -u mysqluser -p -x --all-databases &gt; dbdump.sql</code></pre> <pre><code class="language-opt">mysql -u mysqluser -p &lt; dbdump.sql</code></pre> <h2 id="id-16-4"><a href="#id-16-4" data-id="16-4">§</a><span class="heading">文字コード</span></h2> <ul> <li>デフォルトで utf8mb4 になっている。</li> </ul> <pre><code class="language-output">mysql&gt; show variables like 'char%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8mb3 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+</code></pre> <h1 id="id-17"><a href="#id-17" data-id="17">§</a><span class="heading">Web 公開用ディレクトリを作成する</span></h1> <pre><code class="language-sh">// gweb グループを作成 // 自身を gweb に追加 // www-data (Apache) を gweb に追加(www-data は envvar で設定されている) sudo groupadd gweb sudo gpasswd -a yourname gweb sudo gpasswd -a www-data gweb</code></pre> <pre><code class="language-sh">// 一度ターミナルを抜けて、入り直す exit</code></pre> <pre><code class="language-sh">cd /var/www/ sudo mkdir hosts cd hosts/ // hosts/ のグループを gweb に変更する // グループに書き込み権限を与える // グループに setgid を与える sudo chgrp gweb . sudo chmod g+w . sudo chmod g+s .</code></pre> <pre><code class="language-sh">mkdir web</code></pre> <pre><code class="language-sh">cd /var/www/hosts/web/ mkdir -p www/public_html emacs www/public_html/index.html // hello とでも打って保存しておく</code></pre> <h1 id="id-18"><a href="#id-18" data-id="18">§</a><span class="heading">Apache</span></h1> <p>ここでは以下の内容について作業する。</p> <ul> <li>モジュールの有効化</li> <li>security.conf の設定</li> <li>dir.conf の設定</li> <li>envvars の設定</li> </ul> <h2 id="id-18-1"><a href="#id-18-1" data-id="18-1">§</a><span class="heading">モジュールの有効化</span></h2> <ul> <li>現在有効なモジュールの確認:</li> </ul> <pre><code class="language-sh">sudo apache2ctl -M</code></pre> <ul> <li>モジュールを有効化する。</li> </ul> <pre><code class="language-sh">sudo a2enmod rewrite sudo a2enmod vhost_alias sudo a2enmod authz_groupfile sudo a2enmod headers sudo a2enmod include sudo a2enmod expires sudo a2enmod ssl sudo a2enmod cgi</code></pre> <h2 id="id-18-2"><a href="#id-18-2" data-id="18-2">§</a><span class="heading">security.conf の設定</span></h2> <pre><code class="language-sh">sudo emacs /etc/apache2/conf-available/security.conf</code></pre> <pre><code class="language-diff"> # Set to one of: Full | OS | Minimal | Minor | Major | Prod # where Full conveys the most information, and Prod the least. #ServerTokens Minimal -ServerTokens OS +#ServerTokens OS #ServerTokens Full +ServerTokens Prod # Set to "EMail" to also include a mailto: link to the ServerAdmin. # Set to one of: On | Off | EMail -#ServerSignature Off -ServerSignature On +ServerSignature Off +#ServerSignature On</code></pre> <h2 id="id-18-3"><a href="#id-18-3" data-id="18-3">§</a><span class="heading">dir.conf の設定</span></h2> <pre><code class="language-sh">sudo emacs /etc/apache2/mods-enabled/dir.conf</code></pre> <pre><code class="language-diff"> &lt;IfModule mod_dir.c&gt; - DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm + DirectoryIndex index.php index.cgi index.rb index.html &lt;/IfModule&gt;</code></pre> <h2 id="id-18-4"><a href="#id-18-4" data-id="18-4">§</a><span class="heading">envvars の設定</span></h2> <ul> <li>デフォルトでは LANG=C が適用される。</li> <li>OS のロケールを Apache に引き継ぐ場合は <code>#. /etc/default/locale</code> の行をアンコメントする。</li> <li>今回は、OS のロケールは C.UTF-8 のままにしておき、Apache のみ ja_JP.UTF-8 を使うように設定しておく。</li> </ul> <pre><code class="language-sh">sudo emacs /etc/apache2/envvars</code></pre> <pre><code class="language-diff">-export LANG=C +# export LANG=C +export LANG=ja_JP.UTF-8 # Uncomment the following line to use the system default locale instead: #. /etc/default/locale export LANG</code></pre> <ul> <li>末尾に umask を追記する。</li> </ul> <pre><code class="language-file"># CUSTOMIZE: set 002 to permit g+w for setgid directory umask 002</code></pre> <h1 id="id-19"><a href="#id-19" data-id="19">§</a><span class="heading">httpd.conf の設定をする - HTTP/HTTPS</span></h1> <ul> <li>log.conf 用の cronolog をインストールする。</li> </ul> <pre><code class="language-sh">sudo apt -y install cronolog</code></pre> <h2 id="id-19-1"><a href="#id-19-1" data-id="19-1">§</a><span class="heading">includes 用ファイルを作成する</span></h2> <pre><code class="language-sh">cd /etc/apache2/ sudo mkdir includes cd includes/ sudo emacs make_includes.sh</code></pre> <pre><code class="language-file">#!/bin/bash DOMAIN_APEX_LIST=( example.org ) echo ' # Enable this if your want HSTS (recommended) # * 15768000 = 60 * 60 * 24 * 365 / 2 (= 0.5 year) Header always set Strict-Transport-Security "max-age=15768000"' &gt; hsts.conf; echo ' # Enable this if your want HSTS (recommended) # * 15768000 = 60 * 60 * 24 * 365 / 2 (= 0.5 year) Header always set Strict-Transport-Security "max-age=0"' &gt; hsts_zero.conf; echo ' &lt;Directory /var/www/hosts/web&gt; RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R,L] &lt;/Directory&gt;' &gt; http2https.conf echo ' UseCanonicalName Off' &gt; http.conf for DOMAIN_APEX in ${DOMAIN_APEX_LIST[@]}; do echo " UseCanonicalName Off # refs. https://wiki.mozilla.org/Security/Server_Side_TLS # refs. https://mozilla.github.io/server-side-tls/ssl-config-generator/ SSLEngine on # SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem # SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key SSLCertificateFile /etc/ssl/hosts/${DOMAIN_APEX}/cert.pem SSLCertificateKeyFile /etc/ssl/hosts/${DOMAIN_APEX}/privkey.pem SSLCertificateChainFile /etc/ssl/hosts/${DOMAIN_APEX}/chain.pem # Intermediate configuration, tweak to your needs SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 # SSLCipherSuite FIPS@STRENGTH:!aNULL:!eNULL SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256 SSLHonorCipherOrder on SSLCompression off # 'SSLSessionTickets' directive (Available in httpd 2.4.11 and later) SSLSessionTickets off # OCSP Stapling, only in httpd 2.3.3 and later SSLUseStapling on SSLStaplingResponderTimeout 5 SSLStaplingReturnResponderErrors off # Enable this if your want HSTS (recommended) # * 15768000 = 60 * 60 * 24 * 365 / 2 (= 0.5 year) # Header always set Strict-Transport-Security 'max-age=15768000' # * To disable HSTS. We are using not only HTTPS but HTTP." &gt; "https_${DOMAIN_APEX}.conf" done echo ' LogLevel warn # ErrorLog ${APACHE_LOG_DIR}/error.log # CustomLog ${APACHE_LOG_DIR}/access.log ltsv ErrorLog "| /usr/bin/cronolog /var/log/apache2/logs/error_%Y_%m.log" CustomLog "| /usr/bin/cronolog /var/log/apache2/logs/access_%Y_%m.log" ltsv LogFormat "host:%h\ttime:%t\treq:%r\tstatus:%&gt;s\tsize:%b\treferer:%{Referer}i\tua:%{User-Agent}i\ttaken:%D\tisbot:%{Isbot}e\tdos:%{SuspectDoS}e\tharddos:%{SuspectHardDoS}ecache:%{X-Cache}o" ltsv_legacy LogFormat "opt_time:%{%Y/%m/%d %H:%M:%S}t\tserver:%A\tdomain:%V\tpath:%U%q\thttps:%{HTTPS}e\tmethod:%m\tstatus:%&gt;s\tprotocol:%H\tuser:%u\tident:%l\tsize:%b\tresponse_time:%D\tcookie:%{cookie}i\tset_cookie:%{Set-Cookie}o\ttime:%{%d/%b/%Y:%H:%M:%S %z}t\treferer:%{Referer}i\tagent:%{User-Agent}i\thost:%h" ltsv' &gt; log.conf</code></pre> <pre><code class="language-sh">sudo chmod +x make_includes.sh sudo ./make_includes.sh</code></pre> <h2 id="id-19-2"><a href="#id-19-2" data-id="19-2">§</a><span class="heading">httpd.conf を記述する</span></h2> <pre><code class="language-sh">cd /etc/apache2/ sudo a2dissite 000-default sudo emacs /etc/apache2/sites-available/001-original.conf</code></pre> <ul> <li>SSLStrictSNIVHostCheck off は SNI が利用できないクライアントの場合に、最初にマッチした証明書を返すための設定である。</li> </ul> <pre><code class="language-file">SSLStrictSNIVHostCheck off ############################################################ # default rule (for IP or default host request) ############################################################ &lt;VirtualHost *:80&gt; ServerName 203.0.113.123 ServerAlias www99999ui.vs.sakura.ne.jp DocumentRoot /var/www/hosts/web/www/public_html Include includes/http.conf Include includes/log.conf &lt;Location /&gt; Require all denied &lt;/Location&gt; &lt;/VirtualHost&gt; &lt;VirtualHost *:443&gt; ServerName 203.0.113.123 ServerAlias www99999ui.vs.sakura.ne.jp DocumentRoot /var/www/hosts/web/www/public_html Include includes/https_example.org.conf Include includes/log.conf &lt;Location /&gt; Require all denied &lt;/Location&gt; &lt;/VirtualHost&gt; ############################################################ # ssl.example.org ############################################################ &lt;VirtualHost *:80&gt; ServerName ssl.example.org VirtualDocumentRoot /var/www/hosts/web/%-3+/public_html Redirect / https://ssl.example.org/ Include includes/http.conf Include includes/log.conf &lt;/VirtualHost&gt; &lt;VirtualHost *:443&gt; ServerName ssl.example.org VirtualDocumentRoot /var/www/hosts/web/%-3+/public_html Include includes/hsts.conf Include includes/https_example.org.conf Include includes/log.conf &lt;/VirtualHost&gt; ############################################################ # www.example.org, *.example.org ############################################################ &lt;VirtualHost *:80&gt; ServerName www.example.org ServerAlias *.example.org VirtualDocumentRoot /var/www/hosts/web/%-3+/public_html Include includes/http.conf Include includes/log.conf &lt;/VirtualHost&gt; &lt;VirtualHost *:443&gt; ServerName www.example.org ServerAlias *.example.org VirtualDocumentRoot /var/www/hosts/web/%-3+/public_html Include includes/https_example.org.conf Include includes/log.conf &lt;/VirtualHost&gt; ############################################################ # example.org ############################################################ &lt;VirtualHost *:80&gt; ServerName example.org VirtualDocumentRoot /var/www/hosts/web/www/public_html Include includes/http.conf Include includes/log.conf &lt;/VirtualHost&gt; &lt;VirtualHost *:443&gt; ServerName example.org VirtualDocumentRoot /var/www/hosts/web/www/public_html Include includes/https_example.org.conf Include includes/log.conf &lt;/VirtualHost&gt; ############################################################ # others ############################################################ # SSLStaplingCache SSLStaplingCache shmcb:/var/run/ocsp(128000) # Access denied to all directories (/var/www) &lt;Directory /var/www&gt; Options FollowSymLinks AllowOverride None Require all denied # Access denied to dot-files such as .git/*, but excepts .well-known/* RedirectMatch 403 /\.(?!well-known/) &lt;/Directory&gt; # Access granted to hosts directory (/var/www/hosts) &lt;Directory /var/www/hosts&gt; Options FollowSymLinks AllowOverride All Require all granted # 403 Forbidden for non-existing sub-domains. RewriteEngine On RewriteCond %{DOCUMENT_ROOT} !-d RewriteRule ^ - [F] &lt;/Directory&gt;</code></pre> <pre><code class="language-sh">sudo a2ensite 001-original sudo apache2ctl configtest // SSL サーバ証明書を用意していないのでここではエラーになる</code></pre> <pre><code class="language-sh">cd /etc sudo git add . sudo git commit -m "apache"</code></pre> <h2 id="id-19-3"><a href="#id-19-3" data-id="19-3">§</a><span class="heading">.htaccess への記述</span></h2> <ul> <li>Basic 認証を設定したい場合は次のような .htaccess を設置し .htpasswd を作成する。</li> </ul> <pre><code class="language-opt"># authAccess # NOTE: Execute the following command to create .htpasswd # $ htpasswd -c .htpasswd username AuthUserFile /var/www/hosts/web/DIR_NAME/.htpasswd AuthName "Authorization Required" AuthType Basic Require valid-user</code></pre> <pre><code class="language-opt">RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]</code></pre> <h1 id="id-20"><a href="#id-20" data-id="20">§</a><span class="heading">Let's Encrypt 証明書と tinydns の導入</span></h1> <h2 id="id-20-1"><a href="#id-20-1" data-id="20-1">§</a><span class="heading">certbot インストール</span></h2> <pre><code class="language-sh">sudo apt -y install snapd sudo snap install --classic certbot type certbot certbot --version</code></pre> <pre><code class="language-sh">cd /etc sudo git add . sudo git commit -m "certbot"</code></pre> <h2 id="id-20-2"><a href="#id-20-2" data-id="20-2">§</a><span class="heading">tinydns インストール</span></h2> <ul> <li><a href="http://djbdns.qmail.jp/">http://djbdns.qmail.jp/</a></li> <li><a href="https://cr.yp.to/djbdns/install.html">https://cr.yp.to/djbdns/install.html</a></li> </ul> <pre><code class="language-sh">cd /etc sudo mkdir _tinydns cd _tinydns sudo apt -y install daemontools sudo wget http://cr.yp.to/djbdns/djbdns-1.05.tar.gz sudo tar xzf djbdns-1.05.tar.gz cd djbdns-1.05/ sudo sh -c "echo 'gcc -O2 -include /usr/include/errno.h' &gt; conf-cc" sudo perl -i -pe "BEGIN{undef $/;} s@-d300000@-d400000@smg" tinydns-conf.c sudo make sudo make setup check ls -la /usr/local/bin/ | grep tinydns</code></pre> <h2 id="id-20-3"><a href="#id-20-3" data-id="20-3">§</a><span class="heading">tinydns 起動</span></h2> <ul> <li><a href="http://djbdns.qmail.jp/djbdns/run-server.html">http://djbdns.qmail.jp/djbdns/run-server.html</a></li> </ul> <pre><code class="language-sh">sudo apt -y install svtools daemontools-run</code></pre> <pre><code class="language-sh">sudo useradd tinydns sudo useradd axfrdns sudo useradd dnslog sudo tinydns-conf tinydns dnslog /etc/tinydns $(hostname -I | ag -o '\d+\.\d+\.\d+\.\d+') sudo ln -s /etc/tinydns /etc/service sleep 5 sudo svstat /etc/service/tinydns cd /etc/service/tinydns/root sudo emacs data</code></pre> <pre><code class="language-file">._acme-challenge.example.org::ns.example.org:60 '_acme-challenge.example.org:tinydns-install-succeeded:60</code></pre> <pre><code class="language-sh">sudo make dig _acme-challenge.example.org txt +norec @$(hostname -I | ag -o '\d+\.\d+\.\d+\.\d+')</code></pre> <pre><code class="language-sh">cd /etc sudo git add . sudo git commit -m "tinydns"</code></pre> <h2 id="id-20-4"><a href="#id-20-4" data-id="20-4">§</a><span class="heading">Let's Encrypt 自動更新</span></h2> <pre><code class="language-sh">cd /etc/ssl sudo emacs make_scripts.sh</code></pre> <pre><code class="language-file">#/bin/sh if [ $# -ne 2 ]; then echo "$0 example.org yourmail@example.jp" exit 1 fi echo '#!/bin/sh -eu certbot renew' &gt; will_update_letsencrypt.sh echo '#!/bin/bash -eu DOMAIN_APEX_LIST=( '"$1"' ) MAIL_ADDRESS="'"$2"'" SCRIPT_DIR="/etc/ssl" AUTH_HOOK_PATH="${SCRIPT_DIR}/certbot-auth-hook.sh" CLEANUP_HOOK_PATH="${SCRIPT_DIR}/certbot-cleanup-hook.sh" for DOMAIN_APEX in ${DOMAIN_APEX_LIST[@]}; do certbot certonly --agree-tos --manual --preferred-challenges dns-01 --force-renewal \ -d "*.${DOMAIN_APEX}" -d "$DOMAIN_APEX" -m "$MAIL_ADDRESS" \ --manual-auth-hook "$AUTH_HOOK_PATH" --manual-cleanup-hook "$CLEANUP_HOOK_PATH" done' &gt; update_letsencrypt.sh echo '#!/bin/sh service apache2 restart # service vsftpd restart service postfix restart' &gt; restart_ssl_services.sh echo '#!/bin/sh /etc/ssl/update_letsencrypt.sh /etc/ssl/restart_ssl_services.sh' &gt; update_letsencrypt_and_postprocess.sh echo '#!/bin/sh DATA_PARENT_DIR="/etc/service/tinydns/root" DATA_PATH="${DATA_PARENT_DIR}/data" DOMAIN="_acme-challenge.${CERTBOT_DOMAIN}" TXT_RECORD="'\''${DOMAIN}:${CERTBOT_VALIDATION}:60" echo "${TXT_RECORD}" &gt;&gt; ${DATA_PATH} make -C ${DATA_PARENT_DIR} sleep 1' &gt; certbot-auth-hook.sh echo '#!/bin/sh DATA_PARENT_DIR="/etc/service/tinydns/root" DATA_PATH="${DATA_PARENT_DIR}/data" DOMAIN="_acme-challenge.${CERTBOT_DOMAIN}" TARGET_RECORD="'\''${DOMAIN}:${CERTBOT_VALIDATION}:" sed -i.bak -e "/${TARGET_RECORD}/d" ${DATA_PATH} make -C ${DATA_PARENT_DIR}' &gt; certbot-cleanup-hook.sh chmod +x *.sh</code></pre> <pre><code class="language-sh">sudo chmod +x make_scripts.sh // ドメイン名と通常利用のメールアドレスを引数にする sudo ./make_scripts.sh example.org yourmail@example.jp</code></pre> <pre><code class="language-sh">cd /etc sudo git add . sudo git commit -m "/etc/ssl"</code></pre> <ul> <li>2回目以降は <code>certbot renew</code> を使うことで、期限30日前の場合のみ更新処理が実行される。 <ul> <li><a href="https://blog.n-z.jp/blog/2017-04-26-certbot-renew.html">https://blog.n-z.jp/blog/2017-04-26-certbot-renew.html</a></li> </ul></li> <li>更新処理は <code>certbot renew</code> を使うことが推奨されるが、cron で更新日を明示的に指定したい場合や意図的に強制更新をしたい場合は <code>--force-renewal</code> オプション付きのコマンドで再発行する。</li> </ul> <h3 id="id-20-4-1"><a href="#id-20-4-1" data-id="20-4-1">§</a><span class="heading">cron 記述とスクリプト作成</span></h3> <h4 id="id-20-4-1-1"><a href="#id-20-4-1-1" data-id="20-4-1-1">§</a><span class="heading">/etc/crontab</span></h4> <ul> <li>crontab に追記する。</li> <li>ここでは毎月1日(6時10分)に強制的に証明書を再発行したいので <code>certbot renew</code> を使わずに強制発行している。</li> </ul> <pre><code class="language-sh">sudo emacs /etc/crontab</code></pre> <pre><code class="language-file"># Update sslcert (Let's Encrypt) 10 6 1 * * root /etc/ssl/update_letsencrypt_and_postprocess.sh</code></pre> <pre><code class="language-sh">cd /etc sudo git add . sudo git commit -m "crontab"</code></pre> <h3 id="id-20-4-2"><a href="#id-20-4-2" data-id="20-4-2">§</a><span class="heading">証明書作成 DNS-01 チャレンジ</span></h3> <ul> <li>証明書を発行してみる。</li> </ul> <pre><code class="language-sh">cd /etc/ssl/ sudo ./update_letsencrypt.sh</code></pre> <ul> <li>apache.conf などに書きやすいようにシンボリックリンクを作成しておく。</li> </ul> <pre><code class="language-sh">sudo ln -nfs /etc/letsencrypt/live /etc/ssl/hosts</code></pre> <pre><code class="language-sh">sudo apache2ctl configtest sudo service apache2 restart</code></pre> <pre><code class="language-sh">cd /etc sudo git add . sudo git commit -m "letsencrypt"</code></pre> <ul> <li><a href="https://example.org/">https://example.org/</a> にアクセスできるようになる。</li> </ul> <h3 id="id-20-4-3"><a href="#id-20-4-3" data-id="20-4-3">§</a><span class="heading">証明書作成 HTTP-01 チャレンジ</span></h3> <ul> <li>FQDNを対象として証明書を発行する場合は、以下のコマンドで発行できる。</li> </ul> <pre><code class="language-opt">sudo certbot certonly --apache -d foo.example.org -d bar.example.org</code></pre> <h3 id="id-20-4-4"><a href="#id-20-4-4" data-id="20-4-4">§</a><span class="heading">証明書失効</span></h3> <ul> <li>次のように証明書を予め複製しておけば、失効済み証明書を(研究目的で)利用できる。</li> </ul> <pre><code class="language-opt">sudo mkdir /etc/ssl/ocsp-stapling sudo cp -r /etc/letsencrypt/archive/foo.example.org /etc/ssl/ocsp-stapling</code></pre> <ul> <li>証明書を失効させたい場合は次のコマンドを実行する。</li> </ul> <pre><code class="language-opt">sudo certbot revoke --cert-path /etc/letsencrypt/live/foo.example.org/cert.pem</code></pre> <h1 id="id-21"><a href="#id-21" data-id="21">§</a><span class="heading">OS のパスワードポリシーを設定する</span></h1> <pre><code class="language-sh">cat /etc/pam.d/common-password</code></pre> <pre><code class="language-output"># here are the per-package modules (the "Primary" block) password [success=1 default=ignore] pam_unix.so obscure yescrypt # here's the fallback if no module succeeds password requisite pam_deny.so # prime the stack with a positive return value if there isn't one already; # this avoids us returning an error just because nothing sets a success code # since the modules above will each just jump around password required pam_permit.so # and here are more per-package modules (the "Additional" block) # end of pam-auth-update config</code></pre> <ul> <li>このファイルで細かい設定を行うために pam_pwquality ライブラリ (libpam-pwquality) をインストールする。</li> </ul> <pre><code class="language-sh">sudo apt -y install libpam-pwquality</code></pre> <ul> <li>libpam-cracklib をインストールすると <code>/etc/pam.d/common-password</code> が書き換わる。</li> </ul> <pre><code class="language-diff"> # here are the per-package modules (the "Primary" block) -password [success=1 default=ignore] pam_unix.so obscure yescrypt +password requisite pam_pwquality.so retry=3 +password [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass yescrypt</code></pre> <p>この状態でも辞書にあるフレーズが設定できないなど多少は設定できるパスワードを制限できるが、このままでは最低 4 文字のパスワードを設定することが可能である。ここでは、次のように変更しておく。</p> <ul> <li>difok を 1 にして、1 文字違いのパスワードを設定できるようにする。</li> <li>dcredit, ucredit, lcredit, ocredit を 0 以下にして、minlen 未満のパスワードを設定できないようにする。</li> <li>minlen を 10 にして、最低でも 10 文字の長さを求めるようにする。</li> </ul> <pre><code class="language-sh">sudo emacs /etc/pam.d/common-password</code></pre> <pre><code class="language-diff"> # here are the per-package modules (the "Primary" block) -password requisite pam_pwquality.so retry=3 +password requisite pam_pwquality.so retry=3 minlen=10 difok=1 dcredit=0 ucredit=0 lcredit=0 ocredit=0 password [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass sha512</code></pre> <pre><code class="language-sh">cd /etc sudo git add . sudo git commit -m "common-password"</code></pre> <h1 id="id-22"><a href="#id-22" data-id="22">§</a><span class="heading">FTP (FTPS/SFTP) を設定する</span></h1> <p>FTP 機能を提供したい場合、このセクションの操作を行う。</p> <ul> <li>必要があれば OS ユーザアカウントを作成する</li> </ul> <pre><code class="language-opt">// ユーザを新規作成し、ホームディレクトリも生成する sudo adduser YOUR_ANOTHER_NAME // gweb に追加する sudo gpasswd -a YOUR_ANOTHER_NAME gweb</code></pre> <ul> <li>vsftpd をインストールする</li> </ul> <pre><code class="language-opt">sudo apt -y install vsftpd sudo service vsftpd stop</code></pre> <pre><code class="language-opt">cd /etc sudo git add . sudo git commit -m "vsftpd"</code></pre> <ul> <li>以下の差分を patch として当てる。</li> </ul> <pre><code class="language-opt">emacs ~/vsftpd.patch</code></pre> <pre><code class="language-file">diff --git a/vsftpd.conf b/vsftpd.conf index 0f199c0..84e4361 100644 --- a/vsftpd.conf +++ b/vsftpd.conf @@ -11,7 +11,7 @@ # # Run standalone? vsftpd can run either from an inetd or as a standalone # daemon started from an initscript. -listen=NO +listen=YES # # This directive enables listening on IPv6 sockets. By default, listening # on the IPv6 "any" address (::) will accept connections from both IPv6 @@ -19,7 +19,7 @@ listen=NO # sockets. If you want that (perhaps because you want to listen on specific # addresses) then you must run two copies of vsftpd with two configuration # files. -listen_ipv6=YES +#listen_ipv6=YES # # Allow anonymous FTP? (Disabled by default). anonymous_enable=NO @@ -28,11 +28,11 @@ anonymous_enable=NO local_enable=YES # # Uncomment this to enable any form of FTP write command. -#write_enable=YES +write_enable=YES # # Default umask for local users is 077. You may wish to change this to 022, # if your users expect that (022 is used by most other ftpd's) -#local_umask=022 +local_umask=002 # # Uncomment this to allow the anonymous FTP user to upload files. This only # has an effect if the above global write enable is activated. Also, you will @@ -55,6 +55,10 @@ use_localtime=YES # # Activate logging of uploads/downloads. xferlog_enable=YES +xferlog_file=/var/log/xferlog +xferlog_std_format=NO +log_ftp_protocol=YES +dual_log_enable=YES # # Make sure PORT transfer connections originate from port 20 (ftp-data). connect_from_port_20=YES @@ -96,8 +100,8 @@ connect_from_port_20=YES # predicted this attack and has always been safe, reporting the size of the # raw file. # ASCII mangling is a horrible feature of the protocol. -#ascii_upload_enable=YES -#ascii_download_enable=YES +ascii_upload_enable=YES +ascii_download_enable=YES # # You may fully customise the login banner string: #ftpd_banner=Welcome to blah FTP service. @@ -119,16 +123,16 @@ connect_from_port_20=YES # (Warning! chroot'ing can be very dangerous. If using chroot, make sure that # the user does not have write access to the top level directory within the # chroot) -#chroot_local_user=YES -#chroot_list_enable=YES +chroot_local_user=YES +chroot_list_enable=YES # (default follows) -#chroot_list_file=/etc/vsftpd.chroot_list +chroot_list_file=/etc/vsftpd.chroot_list # # You may activate the "-R" option to the builtin ls. This is disabled by # default to avoid remote users being able to cause excessive I/O on large # sites. However, some broken FTP clients such as "ncftp" and "mirror" assume # the presence of the "-R" option, so there is a strong case for enabling it. -#ls_recurse_enable=YES +ls_recurse_enable=YES # # Customization # @@ -146,9 +150,24 @@ pam_service_name=vsftpd # # This option specifies the location of the RSA certificate to use for SSL # encrypted connections. -rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem -rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key -ssl_enable=NO +#rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem +#rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key +rsa_cert_file=/etc/ssl/hosts/example.org/cert.pem +rsa_private_key_file=/etc/ssl/hosts/example.org/privkey.pem +ssl_enable=YES +ssl_sslv2=NO +ssl_sslv3=NO +ssl_tlsv1=YES +ssl_ciphers=HIGH +force_local_data_ssl=YES +force_local_logins_ssl=YES +require_ssl_reuse=NO +seccomp_sandbox=NO +pasv_max_port=60099 +pasv_min_port=60000 +allow_writeable_chroot=YES +local_root=/var/www/hosts +user_config_dir=/etc/vsftpd/vsftpd_user_conf # # Uncomment this to indicate that vsftpd use a utf8 filesystem.</code></pre> <pre><code class="language-opt">cd /etc sudo patch &lt; ~/vsftpd.patch rm ~/vsftpd.patch</code></pre> <pre><code class="language-opt">sudo touch /etc/vsftpd.chroot_list sudo mkdir -p /etc/vsftpd/vsftpd_user_conf</code></pre> <pre><code class="language-opt">sudo ufw allow 60000:60099/tcp sudo ufw reload sudo service vsftpd restart</code></pre> <pre><code class="language-opt">cd /etc sudo git add . sudo git commit -m "update vsftpd"</code></pre> <ul> <li>FTPS または SFTP で接続できるようになる。</li> </ul> <h2 id="id-22-1"><a href="#id-22-1" data-id="22-1">§</a><span class="heading">SFTP を使用不可にする</span></h2> <p><code>/etc/ssh/sshd_config</code> の差分</p> <pre><code class="language-opt">-Subsystem sftp /usr/lib/openssh/sftp-server +# Subsystem sftp /usr/lib/openssh/sftp-server</code></pre> <pre><code class="language-opt">sudo systemctl restart ssh</code></pre> <h2 id="id-22-2"><a href="#id-22-2" data-id="22-2">§</a><span class="heading">SSH ログインを不可にする</span></h2> <p><code>/etc/ssh/sshd_config</code> の差分(末尾に追記)</p> <pre><code class="language-opt">+DenyUsers YOUR_ANOTHER_NAME</code></pre> <pre><code class="language-opt">sudo systemctl restart ssh</code></pre> <h2 id="id-22-3"><a href="#id-22-3" data-id="22-3">§</a><span class="heading">FTP ルートディレクトリを変更する</span></h2> <pre><code class="language-opt">sudo emacs /etc/vsftpd/vsftpd_user_conf/YOUR_ANOTHER_NAME</code></pre> <pre><code class="language-opt">local_root=/path/to/</code></pre> <pre><code class="language-opt">sudo service vsftpd restart</code></pre> <h1 id="id-23"><a href="#id-23" data-id="23">§</a><span class="heading">postfix をインストールする</span></h1> <pre><code class="language-sh">sudo apt -y install postfix</code></pre> <ul> <li><code>Internet Site</code> を選んで OK を押す</li> </ul> <pre><code class="language-sh">cd /etc sudo git add . sudo git commit -m "postfix"</code></pre> <pre><code class="language-sh">sudo emacs /etc/postfix/main.cf</code></pre> <pre><code class="language-diff">-smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem -smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key +#smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem +#smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key +smtpd_tls_cert_file=/etc/ssl/hosts/example.org/cert.pem +smtpd_tls_key_file=/etc/ssl/hosts/example.org/privkey.pem</code></pre> <p>さらに末尾に以下を追記する。</p> <pre><code class="language-file"># Rewrite Envelope from sender_canonical_classes = envelope_sender sender_canonical_maps = regexp:/etc/postfix/sender_canonical.regexp local_header_rewrite_clients = static:all # CatchAll local_recipient_maps = luser_relay = yourname</code></pre> <p>そして <code>/etc/postfix/sender_canonical.regexp</code> を作成する。</p> <pre><code class="language-file">/^(.*)@(.+)$/ $1@example.org</code></pre> <pre><code class="language-sh">sudo service postfix restart</code></pre> <pre><code class="language-sh">cd /etc sudo git add . sudo git commit -m "update postfix"</code></pre> <pre><code class="language-sh">sudo emacs /etc/aliases</code></pre> <pre><code class="language-file"># See man 5 aliases for format postmaster: root yourname: yourmail@example.jp</code></pre> <pre><code class="language-sh">cd /etc sudo newaliases</code></pre> <pre><code class="language-sh">sudo ufw allow smtp sudo ufw allow smtps sudo ufw reload</code></pre> <pre><code class="language-sh">sudo service postfix restart</code></pre> <pre><code class="language-sh">cd /etc sudo git add . sudo git commit -m "aliases"</code></pre> <h1 id="id-24"><a href="#id-24" data-id="24">§</a><span class="heading">ESM Apps を有効化する</span></h1> <p>Ubuntu ログイン時に以下のような表示がされることがあります。</p> <pre><code class="language-output">Expanded Security Maintenance for Applications is not enabled. 0 updates can be applied immediately. 5 additional security updates can be applied with ESM Apps. Learn more about enabling ESM Apps service at https://ubuntu.com/esm</code></pre> <p>ESM Apps (Expanded Security Maintenance for Applications) は Ubuntu Pro が提供しているセキュリティ管理の拡張機能です。Ubuntu Pro は通常有償ですが、Ubuntu ONE アカウントがあれば無償で最大5台まで LTS Ubuntu を対象にサポートを受けることができます。</p> <ol> <li>Ubuntu ONE のアカウントを作成する <a href="https://login.ubuntu.com/">https://login.ubuntu.com/</a></li> <li><a href="https://ubuntu.com/">https://ubuntu.com/</a> にログインし、Ubuntu Pro dashboard <a href="https://ubuntu.com/pro/dashboard">https://ubuntu.com/pro/dashboard</a> へアクセスする</li> <li>Ubuntu 上で次のコマンドを実行する <code>sudo pro attach $FREE_PERSONAL_TOKEN</code></li> <li>apt を更新する <code>sudo apt update</code>, <code>sudo apt upgrade</code></li> </ol> <pre><code class="language-output">yourname@example:~$ sudo pro attach *** [sudo] password for yourname: Enabling Ubuntu Pro: ESM Apps Ubuntu Pro: ESM Apps enabled Enabling Ubuntu Pro: ESM Infra Ubuntu Pro: ESM Infra enabled Enabling Livepatch Livepatch enabled This machine is now attached to 'Ubuntu Pro - free personal subscription' SERVICE ENTITLED STATUS DESCRIPTION anbox-cloud yes disabled Scalable Android in the cloud esm-apps yes enabled Expanded Security Maintenance for Applications esm-infra yes enabled Expanded Security Maintenance for Infrastructure landscape yes disabled Management and administration tool for Ubuntu livepatch yes enabled Canonical Livepatch service realtime-kernel* yes disabled Ubuntu kernel with PREEMPT_RT patches integrated * Service has variants NOTICES Operation in progress: pro attach For a list of all Ubuntu Pro services and variants, run 'pro status --all' Enable services with: pro enable &lt;service&gt; Account: yourmail@example.jp Subscription: Ubuntu Pro - free personal subscription</code></pre> <p>ESM Apps が有効な状態であれば、Ubuntu ログイン時には次のように表示されます。</p> <pre><code class="language-output">Expanded Security Maintenance for Applications is enabled. 0 updates can be applied immediately.</code></pre> <h1 id="id-25"><a href="#id-25" data-id="25">§</a><span class="heading">ドメイン名を追加する</span></h1> <p>以下は <code>example.net</code> を追加で使えるようにする場合の手順です。</p> <h2 id="id-25-1"><a href="#id-25-1" data-id="25-1">§</a><span class="heading">DNS RRs</span></h2> <ul> <li>TTL は適当に 60 にでもしておく。</li> </ul> <table> <thead> <tr> <th style="text-align: center;">host</th> <th style="text-align: center;">type</th> <th style="text-align: center;">value</th> </tr> </thead> <tbody> <tr> <td style="text-align: center;">_acme-challenge.example.net</td> <td style="text-align: center;">NS</td> <td style="text-align: center;">ns.example.net</td> </tr> <tr> <td style="text-align: center;">ns.example.net</td> <td style="text-align: center;">A</td> <td style="text-align: center;">203.0.113.123</td> </tr> </tbody> </table> <h2 id="id-25-2"><a href="#id-25-2" data-id="25-2">§</a><span class="heading">tinydns</span></h2> <pre><code class="language-sh">cd /etc/service/tinydns/root sudo emacs data // 以下を追記する</code></pre> <pre><code class="language-file">._acme-challenge.example.net::ns.example.net:60 '_acme-challenge.example.net:tinydns-install-succeeded:60</code></pre> <pre><code class="language-sh">sudo make</code></pre> <h2 id="id-25-3"><a href="#id-25-3" data-id="25-3">§</a><span class="heading">/etc/ssl</span></h2> <pre><code class="language-sh">sudo emacs /etc/ssl/update_letsencrypt.sh</code></pre> <pre><code class="language-diff"> DOMAIN_APEX_LIST=( example.org + example.net )</code></pre> <pre><code class="language-sh">sudo /etc/ssl/update_letsencrypt.sh</code></pre> <h2 id="id-25-4"><a href="#id-25-4" data-id="25-4">§</a><span class="heading">Apache</span></h2> <pre><code class="language-sh">cd /etc/apache2/includes sudo emacs make_includes.sh</code></pre> <pre><code class="language-diff"> DOMAIN_APEX_LIST=( example.org + example.net )</code></pre> <pre><code class="language-sh">sudo ./make_includes.sh</code></pre> <pre><code class="language-sh">sudo emacs /etc/apache2/sites-enabled/001-original.conf</code></pre> <pre><code class="language-file">############################################################ # www.example.net, *.example.net ############################################################ &lt;VirtualHost *:80&gt; ServerName www.example.net ServerAlias *.example.net VirtualDocumentRoot /var/www/hosts/example.net/%-3+/public_html Include includes/http.conf Include includes/log.conf &lt;/VirtualHost&gt; &lt;VirtualHost *:443&gt; ServerName www.example.net ServerAlias *.example.net VirtualDocumentRoot /var/www/hosts/example.net/%-3+/public_html Include includes/https_example.net.conf Include includes/log.conf &lt;/VirtualHost&gt; ############################################################ # example.net ############################################################ &lt;VirtualHost *:80&gt; ServerName example.net VirtualDocumentRoot /var/www/hosts/example.net/www/public_html Include includes/http.conf Include includes/log.conf &lt;/VirtualHost&gt; &lt;VirtualHost *:443&gt; ServerName example.net VirtualDocumentRoot /var/www/hosts/example.net/www/public_html Include includes/https_example.net.conf Include includes/log.conf &lt;/VirtualHost&gt;</code></pre> <pre><code class="language-sh">sudo apache2ctl configtest sudo /etc/ssl/restart_ssl_services.sh</code></pre> <h1 id="id-26"><a href="#id-26" data-id="26">§</a><span class="heading">既存サーバーのデータを取得する</span></h1> <h2 id="id-26-1"><a href="#id-26-1" data-id="26-1">§</a><span class="heading">データを保存する</span></h2> <ul> <li>新しいサーバーではなく、既存サーバー上で実行する</li> </ul> <pre><code class="language-sh">sudo -i cd ~ mkdir server_data cd server_data mysqldump -u mysqluser -p -x --all-databases &gt; dbdump.sql cp -a /home/coeurl home_dir cp -a /var/www/hosts var_www_hosts cp /etc/crontab . cd ~ tar czf server_data.tgz server_data</code></pre> <h2 id="id-26-2"><a href="#id-26-2" data-id="26-2">§</a><span class="heading">データを復元する</span></h2> <ul> <li>新しいサーバーで実行する</li> </ul> <pre><code class="language-sh">// server_data のファイルを設置した後... cd /var/www/hosts sudo chgrp gweb -R . find . -type d | xargs sudo chmod g+s</code></pre> </main> </div> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10