Jaybanuan's Blog

どうせまた調べるハメになることをメモしていくブログ

Node.jsの情報源

はじめに

Node.jsの勉強を始めたので、各種情報源をメモしておく。

Node.jsとその周辺

フレームワーク

  • Epress
    • https://expressjs.com/
    • Fast, unopinionated, minimalist web framework for Node.js
    • IBMが関係しているらしい
      • https://en.wikipedia.org/wiki/Express.js
      • In June 2014, rights to manage the project were acquired by StrongLoop. StrongLoop was acquired by IBM in September 2015; in January 2016, IBM announced that it would place Express.js under the stewardship of the Node.js Foundation incubator.

「踏み台」の英語表現

はじめに

踏み台についての英語の記事を検索したかったが、「踏み台」を英語でどう表現するか分からなかったので、調べてみた。

結論

どうもjump host、jump serverあるいはbastion hostなどと表記するらしい。

Wikipediaのjump hostの説明

https://en.wikipedia.org/wiki/Jump_server より。

A jump server, jump host or jumpbox is a computer on a network used to access and manage devices in a separate security zone. The most common example is managing a host in a DMZ from trusted networks or computers.

日本語訳は以下のようになる。

jump server、jump hostあるいはjumpboxは、異なるセキュリティゾーンに配置されている機器に対するアクセスや管理を行うための、ネットワーク上のコンピュータである。 よくある事例は、信頼できるネットワークやコンピュータからの、DMZに配置されているホストに対する管理である。

意味的に「踏み台」で合っていそう。

Wikipediaのbastion hostの説明

https://en.wikipedia.org/wiki/Bastion_host より。

A bastion host is a special purpose computer on a network specifically designed and configured to withstand attacks. The computer generally hosts a single application, for example a proxy server, and all other services are removed or limited to reduce the threat to the computer. It is hardened in this manner primarily due to its location and purpose, which is either on the outside of a firewall or in a demilitarized zone (DMZ) and usually involves access from untrusted networks or computers.

(略)

In an Amazon Web Services (AWS) context, a bastion host is defined as "a server whose purpose is to provide access to a private network from an external network, such as the Internet.

日本語に訳してみる。

bastion hostは、攻撃を防御するために設計および設定された、ネットワーク上の特別な目的のコンピュータである。 そのコンピュータは、一般的には例えばプロキシサーバのような単一のアプリケーションだけをホストしており、その他すべてのサービスはそのコンピュータへの脅威を減らすために削除されているか制限されている。 そのコンピュータの場所と目的、つまりファイアウォールの外側または非武装地帯(DMZ)であり、通常は信頼されていないネットワークまたはコンピュータからのアクセスに晒されるため、前述のような方法で強化されている。

(略)

Amazon Web Services (AWS)の文脈では、bastion hostは「インターネットのような外部のネットワークからプライベートネットワークへのアクセスを提供することが目的のサーバ」と定義されている。

bastion hostを直訳すると要塞ホストだが、確かに踏み台は要塞ホストの一種と言える。 ただ、日本語で「要塞ホスト」と書いてしまうと、「踏み台」という意味は読み取れなくなるな。

AWSではbastion hostは踏み台と思えばいいみたい。 なので、AWSのドキュメントを確認。 https://docs.aws.amazon.com/quickstart/latest/linux-bastion/architecture.htmlより。

Bastion Hosts

Including bastion hosts in your VPC environment enables you to securely connect to your Linux instances without exposing your environment to the Internet. After you set up your bastion hosts, you can access the other instances in your VPC through Secure Shell (SSH) connections on Linux.

日本語に訳してみる。

Bastion Hosts

VPC環境に踏み台(bastion host)を含めることで、環境をインターネットに晒すことなく、Linuxインスタンスに安全に接続できるようになる。 踏み台(bastion host)をセットアップした後は、Linux上のセキュアシェル(SSH)コネクションを通して、VPCにある他のインスタンスにアクセスできる。

補足だが、ここで言う「インスタンス」はEC2インスタンス、すなわち仮想マシンのこと。

[例文] Ansibleのドキュメント(FAQ)

https://docs.ansible.com/ansible/latest/reference_appendices/faq.html より。

How do I configure a jump host to access servers that I have no direct access to?

(略)

Note that ssh -W is available only with OpenSSH 5.4 or later. With older versions, it’s necessary to execute nc %h:%p or some equivalent command on the bastion host.

日本語に訳してみる。

直接アクセスできないサーバにアクセスするためには、どのように踏み台(jump host)を設定すればよいか?

(略)

ssh -WはOpenSSH 5.4以降でのみ利用できる点に注意。 古いバージョンでは、踏み台(bastion host)でnc %h:%pか、それと同等のコマンドを実行する必要がある。

ここでの「jump host」と「bastion host」の違いは、単に表記ゆれと思われる。 英語的には適切な文脈の中であればjump hostもbastion hostもそれほど大きな差はないのかもしれない。

プロキシの設定

はじめに

セキュリティ担保の都合でプロキシ通さないとインターネットに出られない環境では、プロキシの設定が原因でつまずく事が多い。

  • プロキシ除外にテストマシンを指定し忘れて、テスト失敗
  • インタラクティブシェルがどうのとかで、Ansibleの実行に失敗
  • Systemdのサービスへのhttp_proxyの設定し忘れで通信エラー
  • Google Chrome環境変数http_proxyを見てくれない事をすぐに忘れる
  • etc...

毎回同じようなことを調べているので、少しずつ整理していく。

Linux

GNOME

Google Chromeは、GNOMEのプロキシの設定を参照している。

Windows

そのうちまとめる。 WinHTTPとか。

Ansibleにおいて、リストの各要素をシングルクォートで囲んでからカンマで連結

はじめに

諸般の事情により、以下のようなリストについて、

terms:
  - AI
  - Artificial Intelligence

以下のように加工する必要に迫られた。

"'AI', 'Artificial Intelligence'"

つまり、それぞれの要素をシングルクォートで囲って、カンマで連結するとともに、全体をダブルクォートで囲むという加工を行う。 フィルタの使い方がややこしいのに加えて、ハマりどころもあるので、調査記録を残しておく。

最終的に出来上がったPlaybook

試行錯誤した結果、Playbookの内容は以下に落ち着いた。

- set_fact:
    single_quote: "'"

- shell: echo "{{ terms | map('regex_replace', '(^|$)', single_quote) | join(', ') }}"

モジュールdebugを利用して出力した結果の抜粋は以下。

ok: [192.168.8.8] => {
    "msg": "'AI', 'Artificial Intelligence'"
}

フィルタmapを利用することで、リストの各要素にフィルタregex_replaceを適用してシングルクォートで囲む加工を実現している。

また、置換後の文字列であるシングルクォートは、変数を利用して間接的に指定している。

ハマりどころ1 - シングルクォートを即値で表現できない

シングルクォートを即値で表現できないか色々試したが、どれもダメだった。 例えば、以下のようにシングルクォートを指定すると、文法エラーが発生する。

- shell: echo "{{ terms | map('regex_replace', '(^|$)', "'") | join(', ') }}"

全体をダブルクォートで囲まなければ文法エラーにはならないのだが、それでは望んだ結果は得られない。 バックスラッシュでエスケープできないか試したが、これもダメだった。 このもどかしさは、シェルスクリプトでありがちな、クォートやエスケープがネストすると訳が分からなくなるパターンと同じ。 一気に全部作ろうとせずに、タスクを分割して部分的に組み上げていくと、即値で書けるかもしれない。 しかし、中間的な作業変数は作りたくないので、シングルクォートの定数(みたいなもの)を準備することにした。

ハマりどころ2 - 標準のフィルタquote

標準でquoteというフィルタがあり、ぱっと見はこれで良さそうに思える。 フィルタquoteを利用したPlaybookは以下のようになる。

- shell: echo "{{ terms | map('quote') | join(', ') }}"

モジュールdebugを利用して出力した結果の抜粋は以下。

ok: [192.168.8.8] => {
    "msg": "AI, 'Artificial Intelligence'"
}

Artificial Intelligenceはシングルクォートで囲まれているのに、AIは囲まれていない。 調べてみると、Ansibleの問題報告に同じような事例Possible quote filter issue #28084を発見。 Ansibleの中の人のコメントは以下。

So the quote filter decides that a string with an asterisk needs to be quoted, but "/mnt" is fine without quotes. Which is correct for shell usage.

I don't think the quote-filter is what you need to use for your use-case as your intended output is not specific to the shell.

自分なりに意訳すると以下。

そのため、フィルタquoteは、アスタリスクを含む文字列についてはクォートが必要と判断しているが、"/mnt"についてはクォートがなくても問題は起きないと判断している。 フィルタquoteはシェルのために利用するので、これは正しい動作だ。

あなたのユースケースでは、出力結果はシェルでの利用を意図していないので、フィルタquoteは望んでいるものではないと思う。

ということで、フィルタquoteはシェルが解釈することを前提に、クォートするかどうかを独自に判断している。 そのため、フィルタquoteが利用できる状況はかなり限定される。 せめて強制的にクォートするようなフラグがあれば、使いようがあるのだが。

参考

Ubuntu 18.04でコマンドラインからUbuntu Dock (ランチャー)に登録しているアプリを変更

はじめに

やりたいことはタイトル通り。 Ubuntu 18.04上での開発環境を自動構築したかったのが動機。 デフォルトで登録されているRhythmboxやAmazonへのリンクは開発環境には不要だし、追加でGoogle ChromeVS Codeも登録しておきたい。

Dockに登録しているアプリを変更

Dockに登録しているアプリをコマンドラインから確認するには、以下のようにする。

$ gsettings get org.gnome.shell favorite-apps
['ubiquity.desktop', 'firefox.desktop', 'thunderbird.desktop', 'org.gnome.Nautilus.desktop', 'rhythmbox.desktop', 'libreoffice-writer.desktop', 'org.gnome.Software.desktop', 'yelp.desktop', 'ubuntu-amazon-default.desktop']

上記の結果は、Ubuntu 18.04をインストールした直後のデフォルトの状態である。

Dockに登録しているアプリをコマンドラインから変更するには、以下のようにする。

$ gsettings set org.gnome.shell favorite-apps "['google-chrome.desktop', 'firefox.desktop', 'code.desktop', 'org.gnome.Terminal.desktop', 'meld.desktop', 'org.gnome.Nautilus.desktop']"

その結果、画面的には以下のようになる。

f:id:redj:20180831001342p:plain

参考

プロキシの環境下でのUbuntu 18.04のインストールが異常に遅い場合の対処

プロキシを利用している環境でUbuntu 18.04をインストールしたところ、1時間ぐらいかかった。 インストール中のコンソールの出力を見ていると、時刻同期で度々ntp.ubuntu.comに接続しようとしてタイムアウトを起こしていた。 そこで、インストールメディアから「インストールせずにUbuntuを試してみる」でブートした後、以下のように時刻同期をオフにしてからインストーラ(ubiquity)を実行したところ、インストール速度が改善した。

$ sudo su -
$ systemctl stop systemd-timesyncd.service
$ http_proxy=http://proxy:port/ ubiquity

インストール後は、設定ファイル/etc/systemd/timesyncd.confにアクセス可能なNTPサーバを設定しておくか、以下のように時刻同期を止めておいた方がいい。

$ sudo systemctl stop systemd-timesyncd.service
$ sudo systemctl disable systemd-timesyncd.service

参考

~/.ssh以下のパーミッションの一括設定

CentOS 7だと~/.ssh以下のパーミッションを適切に設定しておかないとsshでログインできなかった。 Ubuntu 18.04はそんなことはなかったので、Ubuntusshdの設定が少しゆるい? そこで、以下のように設定する。

  • ディレクトリはオーナーのみ読み書き閲覧可能
  • ファイルはオーナーのみ読み書き可能
  • 鍵はオーナーのみ読み込み可能

これがベストなのかは正直不明。 パーミッションの一括設定のコマンドをメモっておく。

$ find ~/.ssh -type d | xargs chmod 0700
$ find ~/.ssh -type f | xargs chmod 0600
$ find ~/.ssh -type f | grep -E '/id_rsa(\.pub)?$' | xargs chmod 0400

上記コマンド実行後のパーミッションの例は以下。

$ ls -la ~/.ssh
合計 32
drwx------  3 redj redj 4096  7月 10 05:32 .
drwxr-xr-x 26 redj redj 4096  7月 10 05:32 ..
-rw-------  1 redj redj  389  7月 10 05:21 authorized_keys
-rw-------  1 redj redj  279  7月 10 04:58 config
drwx------  2 redj redj 4096  7月 10 05:23 config.d
-r--------  1 redj redj 1675  7月 10 05:21 id_rsa
-r--------  1 redj redj  389  7月 10 05:21 id_rsa.pub
-rw-------  1 redj redj  444  6月 28 00:19 known_hosts