FFRIエンジニアブログ

株式会社FFRIセキュリティのエンジニアが執筆する技術者向けブログです

「サイバーセキュリティプログラミング 第2版」翻訳記

はじめに

FFRIセキュリティエンジニアの村上です。昨年から今年にかけて、案件の一環として、オライリー・ジャパン発行の「サイバーセキュリティプログラミング 第2版」(原書タイトルは "Black Hat Python 2nd Edition") の翻訳をする機会がありました。私自身出版物の翻訳に関わるのは初めてであり、とても貴重な経験を積むことができました。本記事では、技術書の翻訳を通じて私が感じたことや、翻訳の作業にまつわる興味深いエピソードなどについて記載します。

経緯

まず、私が技術書の翻訳をすることになった経緯から話を始めます。最初に本案件の話を耳にしたのは昨年の 2 月、原書が発売される約 2 ヵ月前のことでした。終業直前に Slack を眺めていると、技術書の翻訳に興味がある人の募集がされていたのです。興味を持ってよく読んでみたところ、その技術書は同じ部署の先輩社員が以前翻訳した「サイバーセキュリティプログラミング」の第二版であり、本案件も彼女の紹介によるものであることがわかりました。私はもともと英語の読み書きには抵抗が無く、また、本書のソースコードで使用されている Python も書きなれたプログラミング言語でした。そして、何より珍しい経験ができそうだと思ったので、是非やりたいですと手を挙げて翻訳に参加する運びとなりました。

原書について

次に、今回翻訳した「サイバーセキュリティプログラミング 第2版」の原書である "Black Hat Python 2nd Edition" の概要について軽く触れておきます。

原書の表紙

本書は Python でコードを書きながらサイバーセキュリティについて学ぶことができる内容ですが、特筆すべきは、防御よりも攻撃に焦点が当てられていることです。原書の副題にある "Python Programming for Hackers and Pentesters" という文言や、蛇がこちら側を覗き込んでいる表紙の絵からも、本書の攻撃的なポリシーが伺えます。扱われている内容は、ネットワーク上のパケットを盗聴するなどの低レイヤーな話題から、高レイヤーのアプリケーションまで多岐にわたっています。読者が実際に手を動かしてコードを書いてもらうことを重視しているため、Python のコーディング環境構築について親切に説明されていることも特徴のひとつです。本書は第二版ということで、内容的には 2015 年に出版された初版と重複する章もありますが、変更点もあります。その中で最も大きいのは、記載されているソースコードが Python2 から Python3 にアップデートされた点です。Python2 は既にサポートが終了しているので、これは初版の読者にとっても、今後本書を初めて手に取る読者にとっても、嬉しい点だと思います。

翻訳のスケジュール

続いて、本案件はどのように進んでいたのかについて説明します。まず、4 月下旬にオライリー・ジャパンの編集者の方や他の翻訳者の方たちとオンラインでの顔合わせがありました。本書の翻訳者は 3 人いたのですが、私以外の 2 人は情報セキュリティの業界で豊富な経歴を持っている方たちで、少し緊張したことを覚えています。このときの顔合わせで、私は全 11 章ある本書のうちの 8-11 章、つまり後半の 4 章分を担当することが決まりました。私の担当章の内容は、トロイの木馬を自作して情報を窃取するテクニックや、メモリフォレンジックツールのカスタマイズなどでした。事前にもらっていた原書の PDF に目を通し、特にマルウェアがサンドボックス環境を検知するテクニックについて説明されている箇所が面白いと感じました。顔合わせの少し後、ゴールデンウィークが明けた頃にオライリー・ジャパンから原書が届いたので、しばらくは空き時間にひたすら読み進めていました。 具体的な翻訳の作業は、すべてオライリー・ジャパンの GitHub に作成されたプライベートリポジトリで行いました。原書の本文を Markdown 化したファイルを用意してもらい、担当章のファイルを編集して翻訳文を原文に併記し、随時ソースコードの動作確認を行うのが基本的な作業の流れでした。GitHub で翻訳の作業を進めることで、Pull Request を使ってレビューをしたり、Issue を立てて疑問点を共有でき、とても快適でした。私が本格的に翻訳の作業を開始したのは 7 月下旬で、オライリー・ジャパンのリポジトリへプッシュする前に社内でのレビューなども受けつつ、約 1 ヵ月程度で担当章の翻訳が完了しました。本文の翻訳自体はそれほど時間のかかる作業ではないのですが、その後のレビューやソースコードの修正にはかなりの時間がかかり、すべての作業が完了したのは今年の 3 月、出版の約 1 ヵ月前のことでした。

翻訳にまつわるエピソード

翻訳の作業は、想像もしていなかったところで躓いたり、新しい知見が得られたりと、とても刺激的な体験でした。ここからは、特に印象に残ったエピソードについて、いくつか紹介します。

1. 機械翻訳について

翻訳の作業を始める前に、最終的に自分の言葉ですべて書き直すのであれば、補助的なツールとして機械翻訳を使用し参考にしても構わないですよ、と言われていました。しかし、英語の読み書きがそれなりにできるつもりであったことや、ツールに頼ることで楽をしてしまう微妙な後ろめたさから、初期は自力で翻訳を進めていました。ところが、原書には時々読みづらい文章があり、あるとき魔が差して機械翻訳にかけてみたことがありました。すると、そのまま使えるというわけではないですが、想像以上に自然な文章へと翻訳してくれたことがありました。特に、技術的な文章であっても流れに沿った文章が出てくることが多いのは驚きで、途中からはかなり機械翻訳を併用しながら作業を進めることになりました。

多くの場面で機械翻訳が助けになる一方で、原書には英文ならではの詩的な表現やスラングも稀にあったため、このような場合には日本語の技術書にふさわしい表現へと直す作業が必要でした。この作業には、コンピューターや Python の知識だけではなく、翻訳者の語彙や日本語力も求められるため、時にはひとつの文章を翻訳するために 20 分くらい考え込むこともありました。ひとつの文章を悩みながらじっくりと練る経験は、読みやすい技術文書を書くための良い練習にもなったと感じています。

機械翻訳のような便利なツールの発達によって、技術書を翻訳するハードルは大きく下がりました。しかし、技術書の翻訳の本当の価値は、ただ英語を日本語に置き換えるだけではなく、記載内容の正確さや理解を助けるための訳注やコラムなどを充実させることにあるのだと感じました。

2. 原書の不備について

技術書に限らず、出版物の文章は入念にチェックされた隙のないものという印象があったのですが、原書を丁寧に読んでいくと、意外に不備を見つけることがありました。単純な誤植や、さらには初版のソースコードをアップデートし関数名を変更している箇所で、本文ではそのまま初版で使われていた関数名で説明がされていることもありました。複数人のチェックを受けているはずの出版物にすら不備はあるので、普段の業務などで読む機会のある英語のブログ記事などについても、内容を過信せずに注意深く読むことの大切さを実感しました。そして同時に、完璧な文章を書くことはとても難しいこともよくわかりました (これは翻訳本に不備が見つかったときのための予防線です) 。

3. ソースコードの動作確認について

本案件では、翻訳よりもむしろソースコードの動作確認のほうがメインの作業になりそう、と事前に聞いていました。当初は、多少の誤植などはあっても簡単に直せるものばかりだろう、と楽観的に構えていました。ところが、ふたを開けてみると、ソースコードの動作確認をしていると単純な誤植にとどまらないいくつかの問題に直面し、それらへの対応に多くの時間を割くことになりました。ソースコードの動作確認にまつわる問題への対応は、本案件で最も大変であり、同時に最も楽しい作業だったため、他の翻訳者の方が発見した不備も併せて、いくつか紹介します。

  • インデントのずれ

原書のソースコードには、ソースコード内のインデントがずれているものがありました。Python の文法ではインデントは大きな意味を持っているため、これは致命的な不備でした。この不備の難点のひとつに、ソースコードのインデントがずれていたとしても実行時にエラーが発生せず、本来意図していない挙動でソースコードが動作してしまうことが挙げられます。そのため、すべての処理をひとつひとつ注意深く読む必要がありました。

  • 文字化け問題

いくつかのソースコードは、日本語環境の Windows で実行すると文字化けを起こすことがありました。これは、原書では想定されていなくて当然のことではあるのですが、とはいえそのままでは本書の読者にとってストレスになりうる現象です。そのため、文字化けを起こしうるソースコードでは、 Shift_JIS などへデコードするように訳注を記載する対応をしました。このような対応は些細なことですが、読者に起こりうるトラブルを未然に防ぐことは、翻訳者が与えられる付加価値のひとつだと思っています。

  • pip install にまつわるトラブル

本書では、サードパーティの Python ライブラリをインストールして使用するために、pip install というコマンドでライブラリをインストールするように指示している箇所が複数存在します。ある章で、ソースコードの動作確認のためにライブラリをインストールしようとした際に、大量にエラーメッセージが表示されて失敗してしまったことがありました。表示されたエラーメッセージは、「ライブラリのインストールに必要なソフトウェアが不足しています」という環境構築にありがちなものでした。ライブラリインストールに必要なソフトウェアを事前にインストールしておくことで、最終的にライブラリのインストールには成功しましたが、この作業は手間と時間がかかる面倒なものでした。そこで、この面倒な作業を読者にもやってもらうのは申し訳ないと思ったので、そのライブラリについて調査をしました。

調査の結果、ライブラリのインストールが面倒になった原因は、私がソースコードの動作確認に使用している Python のバージョンにあることがわかりました。pip install コマンドでサードパーティのライブラリをインストールする際、明示的にライブラリのダウンロード元を指定しなかった場合は、Python Package Index (PyPI) からライブラリが取得されます。このとき、インストールしようとしている環境の Python バージョンに対応した、ライブラリのビルド済みバイナリが PyPI に提供されているかどうかが検索されます。既にビルド済みバイナリが提供されている場合は簡単で、提供されているバイナリの zip ファイルをダウンロードし、単に展開することでインストールが完了します。ビルド済みバイナリが提供されていない場合は、インストールしたいライブラリのソースコードをダウンロードし、ローカルでビルドする必要があります。問題となっているライブラリの PyPI リポジトリを見てみると、Python3.8 以前に対応するビルド済みバイナリは提供されているものの、Python3.9 以降に対応したビルド済みバイナリは提供されていないことがわかりました。私がソースコードの動作確認に使用していた Python のバージョンは、まさに 3.9 だったのです。そのため、読者への補足として、Python3.9 を使用している場合のインストールが面倒な理由や、できれば Python3.8 の環境を用意してソースコードを動作させることを推奨することをコラムとして記載しました。

ライブラリのインストールに偶然つまづいたことがきっかけの調査で Python のツール周りについて詳しくなることができたのは、翻訳の作業を通じて得られた副産物のひとつでした。

  • ライブラリのバグ

本書に記載されているソースコードのひとつに、実行時に不可解なエラーメッセージを出力するものがありました。当初私は、エラーの原因が自分の環境にあると思い込み、なかなか解決できずに悶々としていました。しかし、実は問題のソースコードで使用しているライブラリにバグが存在することを他の翻訳者の方たちが発見してくださいました。さらに、彼らは、バグのあったライブラリのリポジトリに修正の Pull Request まで送ってマージされており、その姿を見て同じエンジニアとして感銘を受けました。

4. 紹介している攻撃手法が GitHub の規約で制限される

本書のある章では、自作したトロイの木馬が通信する C&C サーバとして GitHub のリポジトリを使用するという攻撃手法が紹介されています。この手法を初めて読んだとき、私は「なるほど、その手があったか」などと思っていましたが、原書の出版後に GitHub のポリシーがアップデートされ、そのような手法には制限がかけられました。そのため、問題となる章の冒頭には、紹介している攻撃方法は目的によっては GitHub のポリシー違反となるため注意すること、という注意書きが記載されることになりました。本書が防御よりも攻撃に焦点を当てていることを象徴するエピソードです。

おわりに

最後に、私が翻訳の作業を通じて感じたこと、特に伝えたいことを 2 つ述べて、まとめとします。

1 つ目は、技術的な文章の翻訳は単純作業ではなく、生産的な活動であるということです。機械翻訳などを使うことで、文章を日本語に翻訳すること自体はとても容易になったように思えますが、エンジニアは翻訳の作業を通じて元の文章に様々な付加価値をつけることができるのです。これは例えば、ソースコードの動作確認のような内容の裏どりや、翻訳された文章を読む人の理解を助けるために調査をし、訳注やコラムを記載することなどを指しています。ただ翻訳をするだけではなく、原文に対して付加価値をつけることは、業務で英語の文献をまとめて共有するときなどにも意識していくつもりです。また、現在の機械翻訳は決して完璧とは言えず、複雑な文章では主語を取り違えた日本語訳が出てくる事もありました。そのような場面で、専門的な知識を持っていることで、違和感に素早く気付き修正できると感じました。

2 つ目は、エンジニアが技術書の翻訳をすることで得られるものは想像以上に大きい、ということです。出版物に関わっているという緊張感もあり、できるだけ正確な内容を記載するために調査をしたことで、セキュリティや Python に関する知識を深めることができました。また、読者の目を意識して翻訳をしたりコラムを書くにあたっては、自分が書いた文章を客観的に見る必要があり、これは技術的な文章の作成能力を向上させる絶好の機会でした。

エンジニア募集

弊社ではマルウェアの解析などセキュリティの研究開発を行っています。興味のある方は弊社までお問い合わせください。