岸原オカルト研究部

プログラミングを勉強していくブログです

Linuxチートシート 及び httpsサーバーとしてUbuntuをセットアップする

 自分用にLinuxUbuntu)でサーバーを立てる際に必要な情報のメモを取りました。

 前半は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 ファイル/ディレクトリ消去 cat/less ファイルの中身を表示/1ページごとに表示(f,b,j,k等で操作、qで終了) cp/mv ファイルをコピー/移動 -rで再帰的にディレクトリごと操作 ln ハードリンク/-sオプションでシンボリックリンクを作る ハードリンクは複数の実体、シンボリックリンクはショートカット find ファイルを検索できる locate インデックスから探す為高速に検索可能 ubuntuではsudo apt-get install mlocateで作る

--help コマンドのヘルプを見れる変数 man 引数のコマンドの使い方を調べるコマンド -kをつけると類似品検索が可能 LANG=C 各コマンドの前につける事で英語で実行可能、英語のヘルプを見ることができる

bashの操作

Ctl+Aで先頭へ、Ctl+Eで末尾へ Alt+Bで単語前一つへ、Alt+Fで単語後ろ一つへ Ctl+Bでカーソル左へ、Ctl+Fで右へ Ctl+hでBackspace、Ctl+dでそのカーソルの文字を削除、Ctl+wで単語一つ分削除

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で結果の放棄

bashのカスタマイズ

エイリアス

alias lsf='ls -F' とする事でコマンドのカスタマイズが可能 alias rm='fm -I' とすれば既存コマンドの改造は可能

type エイリアスかどうか確認可能 unalias エイリアスかどうか確認可能 \(バックスラッシュ) 元々のコマンドを実行可能

set/shoptコマンドでbashの設置が可能 set -o ignoreeof CtrlDでシェルが終了しなくなる set -o noclobber 既存ファイルの上書きが無効化される

シェル変数

var1='test' echo $var1 → 「test」と表示

PS1 シェルの待機画面の文字列、コマンドの前を決める変数 HISTSIZE HISTFILESIZE コマンド履歴の長さ 長め推奨の様子

設定ファイル

 ログインシェルとしてのbashの起動時は/etc/profile、~/.bash_profile、~/.bashrcが読まれる。  非ログインシェルの時は~/.bashrcのみ。  このテキストファイルをいじればコマンドを打つ必要なくbashの設定を変えられる。

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というスペシャルファイルが用意されており、入力先と指定しても空っぽで、出力先と指定しても何も残らない性質がある。コマンドテスト時に使う。

パイプライン

 lsの内容をlessしたい時に、ファイルをわざわざ出力するのは手間。

 ls -l / | less と打てば、ls-lの内容をlessに送り込める。

テキスト処理

wc 入力ファイルの行数、単語数、バイト数を返す Sort 行を並べ替える -nをつけると数値順に -rをつけると逆転 uniq 連続した重複行を省く cut 区切り文字で区切られた文書の中から特定の位置だけ取り出す tailコマンド 文字の末尾部分を表示 そのターミナルでずっとファイルの追記を監視する際は-fオプション diff/patch 差分表示/差分のパッチを当てる

grep ディレクトリごと検索可能。その際、正規表現を使用可能。

sed 非対話型エディタを呼び出すコマンド。標準出力に変換結果を呼び出す。 sed 1d a.txt 一行目だけを消す sed 'e,$d' a.txt 三行目から最後までを消す sed /^B/d a.txt 戦闘がBで始まる行を削除 sed -n 1p a.txt 一行目だけを表示 -nはパターンスペース(メモリ的な)を表示させないオプション。無いと、ファイルがまたまるごと表示される sed 's/B/C/' a.txt g 全てのBをCにする。gフラグがなければ各行に1つずつしか直さない。 awk 高機能テキスト処理コマンド。一行ずつをレコードと捉え、操作する。

シェルスクリプト

 コマンドをファイルに書いておき、そのファイルをシェルに読み込ませることで実行可能となる。  シェルスクリプトの拡張子は.shが定例。vim a.shを作成し、chmod +x a.shで使用権限を付ける。

シバン

 ファイル名を指定してシェルスクリプトを作動させる際有効。  シェルスクリプトの先頭に#!があった場合、その後ろのコマンドをまず実行する。  #!/bin/bash等としておけば、いちいちbashから実行する必要がない。

source

 シェルスクリプトを作動させるコマンド。現在のシェルでコマンドを一行ずつ実行していく。  ファイル名を指定すると、別のシェルを起動して実行させる為、エイリアスの設定等はなくなってしまうが、  sourceコマンドならそういう事はない。

使い分け

 基本はファイル名指定が楽。  ただし、設定の引継ぎ等にはsourceコマンドが使われる。

置き場所

 ~/binというフォルダによく置かれる。  Vimで~/bash_profileで、PATH="$PATH:~/bin"に追加。

アーカイブと圧縮

 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系ならrpmDebian系なら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 を使いapachecertbotを突っ込む。 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の勉強中です(@kisihara_c)。よければ色々教えて下さい。

主要参考文献