カテゴリー: programming

gdb を使ったデバッグ

  • ふつうの Linux プログラミング」というほんでバグがある C のコード bug_head.c のデバッグ作業をするときに gdb というツールが紹介されていた
  • デバッグ時に gdb が役に立つので、ひとまずその流れを以下でみてみる

基本的なデバッグの流れ

流れを見た方がわかりやすいのでまず実例からみていく

以上のように gdb

  • エラーが出た際のスタックトレース
  • 該当部分のソースコード
  • 各変数の状態出力

などが手軽に行えるイカしたツールです。

参考にしたページ

  • https://qiita.com/aosho235/items/d0bc0191f76ec5bd1776

strace コマンドで遊ぶ

「ふつうの Linux プログラミング」という本をラビットハウス社で輪読しているが、その中で strace コマンドというものが出てきた。

man STRACE(1)

man によると strace とはシステムコールとシグナルをトレースできるツールのようだ

  • NAME: strace – trace system calls and signals
  • SYNOPSIS: strace [-CdffhiqrtttTvVxxy] [-In] [-bexecve] [-eexpr]… [-acolumn] [-ofile] [-sstrsize] [-Ppath]… -ppid… / [-D] [-Evar[=val]]… [-uusername] command [args]
  • In the simplest case strace runs the specified command until it exits. It intercepts and records the system calls which are called by a process and the signals which are received by a process. The name of each system call, its arguments and its return value are printed on standard error or to the file specified with the -o option.

hello, world の strace

ハロワの strace を見てみよう。テスト対象のコードを書く必要もない気がするけど、次のとおり。

コンパイルして、strace を実行してみる。ちなみに実行環境は CentOS 7。

write(1, "Hello, World!\n", 14Hello, World!) = 14 とあるように標準出力に Hello, World!\n という文字列を write(2) しているのがわかる。 -c オプションをつけるとなんかかっこいい感じに統計情報をだしてくれる。

-e オプションでトレースしたいシステムコールを指定できる

echo のソースコード

ハロワを出力するだけなら echo で良いので、echo の strace をみてみた

echo なんかもおんなじ感じの出力になったので、ソースコードを探しに南米へと飛んだ

なるほどな… と思ってソースコード探そうとしたら江添さんがすでにいろんなUNIX環境での echo のソースコードについて比較している記事が引っかかった。ふむふむ〜。で、実際のソースコードがこれ。意外にながくてクソだるですわ…。結局最後のほうで、fputs, putchar を呼び出している感じで、これらは内部でバッファリングして、write を呼び出しているので、システムコールの呼び出しは 1回なのだろうみたいな感じの模様。

macOS で dtruss を使う

macOS では strace の代わりに dtruss を使えば同じようなことして遊べそう。

logrotate のログ保持日数の変更

例えば以下のような fluentd ログの logrotate 設定が入っているとします。

この前提のもと、保持する世代を減らすために rotate の設定を 8 から 5 に減らす場合には注意が必要で、6世代目ファイルのみが削除され、6-8世代のファイルが残ってしまいます。簡単に次のようなコマンドで消しておくとよいかも。保持期間を増やすときはあまり問題は生じなそう?

各設定項目は man を見るのが一番良さそう。ソースコードはここでみれます。
ちなみに logrotate の状況は /var/lib/logrotate/logrotate.status で確認できます。

ファイルを掴みっぱなしになってるプロセスへの対応

  1. postrotate でシグナルをおくってやる
  2. copytruncate オプションをつける

copytruncate 便利ですね…

Apach と nginx への HSTS 設定

HSTS(HTTP Strict Transport Security)とは?

  • SSL に対応しているウェブサーバーへの HTTP リクエストに対し、サーバー側がレスポンスヘッダに SSL 通信が可能であることを表すデータを付与することにより、ブラウザに HTTPS での通信を行うことを促す仕組みを HSTS とよぶ
  • RFC6797 で定義される: https://tools.ietf.org/html/rfc6797
  • 301 でリダイレクト先を指定する際、そのリダイレクト先が改ざんされていないことを保証できない欠点を補える

技術的な仕組み

  1. ユーザーが HTTP リクエストを対象サーバーに送る
  2. サーバーは https エンドポイントへ301リダイレクトレスポンスを返す
  3. https エンドポイントはレスポンスヘッダに 以下を付与しブラウザに HTTPS で通信を行うことを促す
    • Strict-Transport-Security "max-age=31536000; includeSubDomains"
    • ここで max-age はブラウザ側に当該ドメインが HTTPS 通信に対応しているという事実をキャッシュする長さ(秒)である
    • includeSubDomains をつけるとサブドメインを含めて、HTTPS 通信に対応しているということを伝達する
  4. HSTS に対応しているブラウザは、その後対象ドメインに対してはデフォルトで HTTPS を見に行く

注意点

  • 誤った設定であろうと、一度 Strict-Transport-Security ヘッダーを受け取ったHSTS対応のブラウザは max-age の時間分、対象ドメインにHTTPでリクエストを送ろうとしても HTTPS に切り替えてしまう
  • 誤設定の可能性を考慮すると、最初の設定の max-age は短くしておき、作業ミスがあった際の影響を小さく留めておくとよい

Apache, nginx への設定

  • 基本的にはレスポンスヘッダに Strict-Transport-Secutiry を追加するだけ
    • Apach は mod_header モジュールを用いて、レスポンスヘッダを追加
    • nginx は add_header ディレクティブで、レスポンスヘッダを追加

Apache

nginx

動作確認

preload の登録

https://hstspreload.org/ で登録する

chrome での処理のされ方

307 でリダイレクトがかかる模様

ssllabs での確認

https://www.ssllabs.com/ssltest/analyze.html?d=53ningen.com で見れば HSTS が有効になっていることがわかる

特定ホストに対してのみ踏み台を経由して Ansible を実行する

ネットワーク的に踏み台サーバーを経由しないと到達できないサーバーに Ansible を流す

公式ドキュメントに書かれている方法はすべてのサーバーでの作業時に踏み台を踏むような形になるが、外から疎通できない一部のホストだけ踏み台を踏むようにしたい場合は、host_vars に対象ホスト名と同じ名前でファイルを作って、以下のように設定を入れればよい。