はじめに
自分用にLinux(Ubuntu)でサーバーを立てる際に必要な情報のメモを取りました。
つまりただUbuntuでサーバーを立てるだけです。
自分用なのでちょっと変な構成ですが、前半はLinux自体のチートシート、後半はWebサーバー/Apache関連です。
Linuxについて
Linuxの操作はシェルで行う。
シェル≠OS、シェル≠カーネル。シェルとはUIで、心臓部のカーネルと完全に分離している。
多重起動
sh(シェル起動)→bash(シェル起動)→exit(シェル終了)→exit(同左)→exit(最初のbash終了によりLinux終了)
echo Hello
→Hello
Linuxの構造
Linux上の情報は全てファイルとして扱われる。ドライバ類もファイルとして扱われる。
/bin コマンドの実行ファイル
/dev デバイスファイル(windowsで言うドライバ類)
/etc 各種設定ファイル(winで言うwindowsフォルダ)
/home ユーザーごとのホームディレクトリ
/sbin 管理者向けコマンドの実行ファイル
/tmp 一時ファイル用ディレクトリ 定期的に削除するディストリビューションもあるので、大事なファイルは置かない
/usr アプリケーションが置かれる このサブディレクトリとして再帰的にbinやsbinなどがあったりする
/var いろんなデータのディレクトリ
ディレクトリの移動はpwd(現在地表示)/cd(移動)/ls(ファイル一覧)で行う。
cdはTabで補完可能。また、引数なしならホームディレクトリに戻る。
lsはパス名展開(*/?)と組み合わせると便利。引数-l:属性表示、引数-a:隠しファイル表示、引数-F:ファイル種類表示
mkdir ディレクトリ作成
touch ファイル作成 タイムスタンプを作るコマンドなので、既存のファイルを上書きしないから安心して使える
rm/rmdir ファイル/ディレクトリ消去
cp/mv ファイルをコピー/移動 -rで再帰的にディレクトリごと操作
find ファイルを検索できる
locate インデックスから探す為高速に検索可能 ubuntuではsudo apt-get install mlocateで作る
bashの操作
Ctl+kは行末までをカット、Ctl+uは行頭までをカット
Ctl+yは「ヤンク」(ペースト)
Ctl+sで画面をロックしてしまった場合はCtl+qで戻す
Ctl+cでコマンドの強制終了
表示がおかしい場合はCtl+lで画面リセット→resetコマンド→再ログイン
Tabは入力補完の呼び出し、複数候補がある場合はたくさん出てくる
矢印かCtl+p or Ctl+nで履歴を遡る事が可能、Ctl+rでコマンド履歴の検索も可能
コマンド検索時:Enterで実行、Escで結果を保持したままコマンドへ、Ctrl+gで結果の放棄
--help コマンドのヘルプを見れるオプション
man 引数のコマンドの使い方を調べるコマンド -kをつけると類似品検索が可能
LANG=C 各コマンドの前につける事で英語で実行可能、英語のヘルプを見ることができる
vim(テキストツール)
:q 終了
:w ファイルを保存 引数は新しいファイル名
:q! 保存せず終了
i 入力モード開始
Esc 入力モード終了
hjkl カーソル移動
x/J 文字を削除/改行を削除
w/b 単語単位で移動
0/$ 行頭/行末へ移動
gg/G/数字+G 最初の行に移動/最後の行に移動/任意の行に移動
y/d/p コピー/カット/ペースト
u/Ctr+r アンドゥ/リドゥ
/ 検索 nで次の検索結果、Nで前の検索結果に
%/<置換元>/置換後/g
vimtutor/:help チュートリアル、ヘルプ
Linuxの挙動
ファイル/ディレクトリの権限
ファイルにはオーナー/グループ/パーミッション(権限)が存在。読み込み、書き込み、実行の権限を操作できる。
ディレクトリにも同様の権限がある。ファイルの削除可不可はディレクトリのパーミッションで決まる事に注意。
変更はchmod u/g/o/a,+/-/=,r/w/x ファイル名 で可。
スーパーユーザ
スーパーユーザ≒rootユーザはあらゆるファイルの操作が可能。システムファイルも含む。
そのため基本は一般ユーザを操作し、必要なときだけsudoコマンド等でスーパーユーザを使うのが良い。
su/sudoコマンドの権限等を一般ユーザに設定するには/etc/sudoersを操作する。その際特別なコマンドが必要。
プロセス/ジョブ
メモリ上で実行状態のプログラムをプロセスと呼ぶ。
プロセスは一つ一つが独立したメモリ領域とIDを持ち、並列的に実行可能。
ps 動作中のプロセスを確認可能。オプションを付ければ裏で動いているプロセスも見られる。
コマンドの一行のことをジョブと呼ぶ。
パイプでコマンドを繋いだ際、コマンドライン全体でジョブ、一つ一つのコマンドがプロセスとなる。
コマンドのIDはシェルごとに一意。
Ctrl+Z jobの一時停止
jobs 実行中のjob一覧
fg %ジョブ番号 ジョブの復帰
bg %ジョブ番号 バックグラウンドでジョブを動かし続ける
Ctrl+C 動いているジョブを強制終了させる
kill %ジョブ番号 バックグラウンドのジョブを強制終了させる
killコマンドはプロセスも終了させる事ができ、場合によっては使う。※元々はプロセスに特定のシグナルを送るコマンド
入出力
コマンド実行時、標準入力/標準出力/標準エラー出力の三チャネルが開かれる。
標準入出力のリダイレクトは可能。
たとえば cat < ファイル とすると、ファイルが代わりに入力される。
ls >> a.txtとするとファイルが代わりに出力される。
ls 2>> a.txtとするとエラー時ファイルが変わりに出力される。
ls >> a.txt 2>>&1とすると普通の実行時もエラー時も同じファイルに出力される。
linuxには/dev/nullというスペシャルファイルが用意されており、入力先と指定しても空っぽで、出力先と指定しても何も残らない性質がある。コマンドテスト時に使う。
アーカイブと圧縮
Linuxではアーカイブと圧縮は別々の単語。
アーカイブは一つのファイルにまとめるだけ。圧縮は基本アーカイブ後に行い、更にファイルを縮める。
tar cf b.tar dirA dirAからb.tarという圧縮ファイルを作る
tar tf b.tar b.tarの中身を見る
tar xf b.tar b.tarの中身を復元。
gzip a.txt a.gzを作る
gunzip a.gz 解凍する
zip/unzip Linuxならsudo apt-get install zip unzip等でインストール可
パッケージとリボジトリ
パッケージとは一つのソフトをまとめたもの。
Redhat系ならrpm、Debian系ならdebファイルが使われる。
Debian系ではapt系コマンドを使いインストールする。依存性の解決は勝手にやってくれる。
パッケージを集めて配布しているサイトをリポジトリと呼ぶ。
SSH
SSHとはSecureShellの略。リモートマシンと通信するためのプロトコルで、認証・暗号化の機能を持つため安全に操作できる。
通常はTCP22ポートが利用される。
Linux,Ubuntuでサーバーを立てる
今回さくらVPSを使用する。
理由:知っていた、安い のみ しっかりした比較はしていない
公式書面通りデフォルト設定だとセキュリティについては不十分の様子、人に迷惑をかけるリスク等を考えまずセキュリティ対策が必要。その後Apacheを入れる。
Ubuntuインストール
標準インストールでUbuntu20を入れる。
セキュリティ
基本指針
以下はメンター紹介サービスでお金を払って聞いた情報で、この記事の指針とする。
信憑性不完全ゆえ指摘願います。
- セキュリティの要はポート開閉 しっかり閉める 特にポートの種類で危険度の制御が可能で、HTTPポートへの複雑な攻撃は難しい
- SSH鍵認証はパスワード認証とは比にならないほど安全。ちゃんと設定。業務でかつ規模の大きいサービスは、SSHに繋ぐ時も踏み台を経由する
- rootはやはり誤操作や乗っ取りが危険、封印が基本
- セキュリティパッチ/アップデートを定期的に当てる
- 追加Linux用セキュリティソフトは業務用等で存在するだろうが、企業予算レベルで高いはずなのであまり考えない
アップデートする
定期的に実行の事。
sudo apt update OSのアップデート
sudo apt upgrade パッケージのアップデート
sudo reboot 2つこなしたらこのコマンドで再起動
一般ユーザーの用意
さくらVPS公式でデフォルトで用意されるユーザー ubuntuは一般ユーザーと思われる。
teraterm,ターミナルマルチプレクサー
SSHクライアント/コンソールエミュレータとしてはteraTermが良さそうなので導入。
また、ターミナルマルチプレクサーという複数のターミナルを管理できるソフトを準備。
本来の用途とは少しズレるのだが、コマンドを入れて一晩処理させる時等にセッションが維持される点で有用な為。
※情報元:http://www.tohoho-web.com/ex/tmux.html
ubuntu serverにはtmuxという有名ターミナルマルチプレクサーが既に入っている。
tmuxコマンドで起動。
再ログイン時はtmux attachで以前のセッションを復帰。SSH切断時等に生きるので、なるべくtmuxから動かすようにする。
SSHポート番号の変更
デフォポート22はやはり不正アクセスが多い模様。
※情報元:https://www.softel.co.jp/blogs/tech/archives/1516
vi /etc/ssh/sshd_configから、#Port 22という記述の一行下に「Port n」を追加。
sudo systemctl restart sshd によって再起動、
sudo systemctl status sshd によって確認。
teratermで新ポートからログイン可能か確かめてからパケットフィルタを解除。
ufwの設定
iptablesというセキュリティツールのインターフェイスソフト ufwで設定を行う。
※情報元:https://qiita.com/shimakaze_soft/items/c3cce2bfb7d584e1fbce
sudo ufw enable でufwを有効化。
sudo ufw status numbered で有効なことを確認。
sudo ufw allow sshPort でsshポートを開ける。
秘密鍵作成
teratermを起動し、開始時の接続ウィザードからキャンセルで抜ける。
setup→ssh keygeneratorウィザードを起動。RSA2048で大丈夫らしいので、そのまま生成。
パスフレーズを入れ、公開鍵と秘密鍵を保存して閉じる。
ubuntu本体のHomeディレクトリへ公開鍵を突っ込み
mkdir -p ~/.ssh
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
rm ~/id_rsa.pub
sudo vim /etc/ssh/sshd_config
PubkeyAuthentication yesのコメントアウトを解除
PasswordAuthentication をnoにして
sudo systemctl restart ssh にてsshをリセット
WinSCP
teratermでもSCP(SSHを利用したファイル転送)が使えるが、色んな所で書かれてる通りteratermのSCPは最低限のシンプルなもの。
WinSCPを入れる。ドラッグドロップ等でやり取り可能。
初回起動ウィザードでユーザー名だけ入れて設定を作成、AdvancedのSSH→Authorizationで秘密鍵を登録。.ppkファイルが必要だそうなので道なりにそのまま作成。
後は道なりにhomeディレクトリにアクセスできる。
Apache
sudo apt install apache2 にてapacheをインストール。
この時点でufwを解除してからサーバーURLにブラウザでアクセスするとApacheデフォルトが表示される。
WinSCPでwww/htmlの中身を変更。
なお、転送の際は
sudo chown -r user apacheのWWWフォルダ 等として所有者を自分に変更する。
文字化けする場合はとりあえずHTMLヘッダーを確認する。
vim /etc/apache2/conf-available/charset.conf デフォルトの文字エンコードも確認する。
※情報元:https://obel.hatenablog.jp/entry/20171016/1508119266
他、いわゆるhttpd.confファイルは現在etc/apache2/の中に分散して存在しているので、まとめて同じ設定項目をgrepする。
sudo ufw allow 'Apache Full' でApache用のポートを開けて、こちらも確認。
(素人考えだとソフト任せが危険な気がして、sudo ufw allow 80/tcp,sudo ufw allow 443/tcpのほうがよいように思うが、複数ソースで上記の通りだった為恐らくこちらが正しい)
SSL
Let's encryptでSSLをつける。
https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-20-04-ja
https://weblabo.oscasierra.net/letsencrypt-2/ (※CentOS)
公式見たりすると色々方法があるが一応この二つがよさそう。
sudo apt install certbot python3-certbot-apache を使いapacheにcertbotを突っ込む。
sudo vim /etc/apache2/sites-available/your_domain.conf からServerNameとServerAliasを確認。
sudo apache2ctl configtest で構文をテスト。(SyntaxOKを確認)
sudo certbot --apache を実行。
メールアドレス、メールマガジン配信の有無、どのドメインを有効化するか(空欄推奨)、HTTPSへリダイレクトするか(多分リダイレクトが良い)聞かれてHTTPS化は完了。
sudo systemctl status certbot.timer の表示がactiveで、かつ
sudo certbot renew --dry-run でエラーが出なければ自動更新も問題ないはず。
完成、サーバーURLもしくは登録済みのドメインにhttpsアクセスができるはずです。
おわりに
ご指摘頂けますと幸いです。
特に後半は正しさを担保できず、勉強の為にも特にご意見下さい。
現在twitterにてWebの勉強中です。これからもやっていきますのでよければ色々教えて頂けますと幸いです。
https://twitter.com/kisihara_c
主要参考文献
- 新しいLinuxの教科書 https://www.sbcr.jp/product/4797380941/ 素敵な本でした。ありがとうございました。
- シェルスクリプト UbuntuではじめるLinuxサーバー https://shell-mag.com/portal-linuxserver/
- さくらVPSでウェブアプリ公開まで https://qiita.com/ryo-futebol/items/09fb52e0d204a70895d0
- さくらインターネット公式ドキュメント