headless-chromeとpuppeteerを使った、web操作の自動化とscraping

headless-chromeとpuppeteerを使った、web操作の自動化とscraping

puppeteerとは

Puppeteer is a Node library API that allows us to control headless Chrome.

$ npm i puppeteer

Headless Chromeとは

Headless Chrome is a way to run the Chrome Browser without actually running Chrome.

Taking a Screenshot

1  const puppeteer = require('puppeteer');
2 
3  async function getPic() {
4   const browser = await puppeteer.launch();
5   const page = await browser.newPage();
6   await page.goto('https://google.com');
7   await page.screenshot({path: 'google.png'});
8 
9   await browser.close();
10 }
11 
12 getPic();

Something important to note is that our getPic() function is an async function and makes use of the new ES 2017 async/await features.

L4 We’re essentially launching an instance of Chrome and setting it equal to our newly created browser variable.

L5 Here we create a new page in our automated browser.

L6 In this example, we’re navigating to google. Our code will pause until the page has loaded.

L7 Now we’re telling Puppeteer to to take a screenshot of the current page

L9 we close down our browser

google.png

- const browser = await puppeteer.launch();
+ const browser = await puppeteer.launch({headless: false});

you can actually watch Google Chrome work as it navigates through your code.

+ await page.setViewport({width: 1000, height: 500})

google.png

Scrape some Data

1 const puppeteer = require('puppeteer');
2 
3 let scrape = async () => {
4     const browser = await puppeteer.launch({headless: false});
5     const page = await browser.newPage();
6 
7     await page.goto('http://books.toscrape.com/');
8     await page.click('#default > div > div > div > div > section > div:nth-child(2) > ol > li:nth-child(1) > article > div.image_container > a > img');
9     await page.waitFor(1000);
10
11    const result = await page.evaluate(() => {
12        let title = document.querySelector('h1').innerText;
13        let price = document.querySelector('.price_color').innerText;
14
15        return {
16            title,
17            price
18        }
19
20    });
21
22      browser.close();
23      return result;
24. };
25
26  scrape().then((value) => {
27      console.log(value); // Success!
28  });

L8 We now have our selector copied and we can insert our click method into our program.

L11 In order to retrieve these values, we’ll use the page.evaluate() method. This method allows us to use built in DOM selectors like querySelector().

https://gyazo.com/1bde38cca9ff1e0ad7fba0383c308ba2

❯ node scrape.js
{ title: 'A Light in the Attic', price: '£51.77' }

Perfecting it

     const page = await browser.newPage();

     await page.goto('http://books.toscrape.com/');
-    await page.click('#default > div > div > div > div > section > div:nth-child(2) > ol > li:nth-child(1) > article > div.image_container > a > img');
-    await page.waitFor(1000);

     const result = await page.evaluate(() => {
-        let title = document.querySelector('h1').innerText;
-        let price = document.querySelector('.price_color').innerText;
+        let data = []; // Create an empty array that will store our data
+        let elements = document.querySelectorAll('.product_pod'); // Select all Products

-        return {
-            title,
-            price
+        for (var element of elements){ // Loop through each proudct
+            let title = element.childNodes[5].innerText; // Select the title
+            let price = element.childNodes[7].children[0].innerText; // Select the price
+
+            data.push({title, price}); // Push an object with the data onto our array
         }

+        return data; // Return our data array
     });

     browser.close();

感想

結構簡単なコードでいろいろ動かせるので、おもしろい。 ただ、今回なんとなくの理解だったES2017のasync/awaitは勉強したい。

https://github.com/tenshotanaka/scripts/pull/3/commits/51c934da451de50978401370f2bec908c97e47ad

Reference from

AltCSSについて雑多に書く。scss(sass), less, stylus

Sass

Summary

2014/3 version: 3.2.15 current release: 3.5.4

https://github.com/sass/sass

Sass can be used from the command line or as part of a web framework. The first step is to install the gem:

$ gem insatll sass

After you convert some CSS to Sass, you can run

$ sass style.scss

to compile it back to CSS. For more information on these commands, check out

自動コンパイル

$ sass --watch app/sass:public/stylesheets

option

$red:#FF3399;

.red {
  color: $red;
}
  • nested - sassファイルのネストの深さが引き継がれます
$ sass style.scss:style.css --style nested
.red {
  color: #FF3399; }
  .red-.warning {
    font-weight: bold; }
  • expanded - 典型的なCSSの記述スタイルにする
$ sass style.scss:style.css --style expanded
.red {
  color: #FF3399;
}
.red-.warning {
  font-weight: bold;
}
  • compact - セレクタと属性を1行で記述してくれます
$ sass style.scss:style.css --style compact
.red { color: #FF3399; }
.red-.warning { font-weight: bold; }
  • compressed - すごく圧縮してくれる方法。可読性は悪いが軽くなる
$ sass style.scss:style.css --style compressed
.red{color:#f39}.red-.warning{font-weight:bold}

Syntax

Variables

$font-stack:    Helvetica, sans-serif
$primary-color: #333

body
  font: 100% $font-stack
  color: $primary-color

Nesting

nav
  ul
    margin: 0
    padding: 0
    list-style: none

  li
    display: inline-block

  a
    display: block
    padding: 6px 12px
    text-decoration: none

Partials

You can create partial Sass files that contain little snippets of CSS that you can include in other Sass files. You might name it something like _partial.scss. Sass partials are used with the @import directive.

// _reset.sass

html,
body,
ul,
ol
  margin:  0
  padding: 0
// base.sass

@import reset

body
  font: 100% Helvetica, sans-serif
  background-color: #efefef

Mixins

=border-radius($radius)
  -webkit-border-radius: $radius
  -moz-border-radius:    $radius
  -ms-border-radius:     $radius
  border-radius:         $radius

.box
  +border-radius(10px)

When your CSS is generated it'll look like this:

.box { -webkit-border-radius: 10px; -moz-border-radius: 10px; -ms-border-radius: 10px; border-radius: 10px; }

Extend/Inheritance

.message
  border: 1px solid #ccc
  padding: 10px
  color: #333


.success
  @extend .message
  border-color: green


.error
  @extend .message
  border-color: red


.warning
  @extend .message
  border-color: yellow

This is what it looks like:

.message, .success, .error, .warning {
  border: 1px solid #cccccc;
  padding: 10px;
  color: #333;
}

.success {
  border-color: green;
}

.error {
  border-color: red;
}

.warning {
  border-color: yellow;
}

Operators

.container
  width: 100%

article[role="main"]
  float: left
  width: 600px / 960px * 100%


aside[role="complementary"]
  float: right
  width: 300px / 960px * 100%

The generated CSS will look like:

.container {
  width: 100%;
}

article[role="main"] {
  float: left;
  width: 62.5%;
}

aside[role="complementary"] {
  float: right;
  width: 31.25%;
}

scss(Sassy CSS)

Sass3.0からCSSちっくに書くことが出来るようになったsassの記法の一つ。

http://sass-lang.com/documentation/file.SCSS_FOR_SASS_USERS.html

Syntax

Variables
$font-stack:    Helvetica, sans-serif;
$primary-color: #333;

body {
  font: 100% $font-stack;
  color: $primary-color;
}
Nesting
nav {
  ul {
    margin: 0;
    padding: 0;
    list-style: none;
  }

  li { display: inline-block; }

  a {
    display: block;
    padding: 6px 12px;
    text-decoration: none;
  }
}
Partials

You can create partial Sass files that contain little snippets of CSS that you can include in other Sass files. You might name it something like _partial.scss. Sass partials are used with the @import directive.

// _reset.sass

html,
body,
ul,
ol
  margin:  0
  padding: 0
// base.sass

@import 'reset';

body {
  font: 100% Helvetica, sans-serif;
  background-color: #efefef;
}
Mixins
@mixin border-radius($radius) {
  -webkit-border-radius: $radius;
     -moz-border-radius: $radius;
      -ms-border-radius: $radius;
          border-radius: $radius;
}

.box { @include border-radius(10px); }

When your CSS is generated it'll look like this:

.box {
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
  -ms-border-radius: 10px;
  border-radius: 10px;
}
Extend/Inheritance
.message {
  border: 1px solid #ccc;
  padding: 10px;
  color: #333;
}

.success {
  @extend .message;
  border-color: green;
}

.error {
  @extend .message;
  border-color: red;
}

.warning {
  @extend .message;
  border-color: yellow;
}

This is what it looks like:

.message, .success, .error, .warning {
  border: 1px solid #cccccc;
  padding: 10px;
  color: #333;
}

.success {
  border-color: green;
}

.error {
  border-color: red;
}

.warning {
  border-color: yellow;
}
Operators
.container { width: 100%; }


article[role="main"] {
  float: left;
  width: 600px / 960px * 100%;
}

aside[role="complementary"] {
  float: right;
  width: 300px / 960px * 100%;
}

The generated CSS will look like:

.container {
  width: 100%;
}

article[role="main"] {
  float: left;
  width: 62.5%;
}

aside[role="complementary"] {
  float: right;
  width: 31.25%;
}

Less

2010/4/23 version: 1.0 current release: 2.7.3

Less. The dynamic stylesheet language.

$ npm install less -g
or
$ npm i less --save-dev

or

<script src="less.js"></script>
<link rel="stylesheet/less" type="text/css" href="styles.less" />

https://github.com/less/less.js

compile

$ lessc bootstrap.less bootstrap.css

Syntax

Variables

// Variables
@link-color:        #428bca; // sea blue
@link-color-hover:  darken(@link-color, 10%);

// Usage
a,
.link {
  color: @link-color;
}
a:hover {
  color: @link-color-hover;
}
.widget {
  color: #fff;
  background: @link-color;
}

Variable Interpolation

// Variables
@my-selector: banner;

// Usage
.@{my-selector} {
  font-weight: bold;
  line-height: 40px;
  margin: 0 auto;
}

compiles to

.banner {
  font-weight: bold;
  line-height: 40px;
  margin: 0 auto;
}

Nesting

#header {
  color: black;
}
#header .navigation {
  font-size: 12px;
}
#header .logo {
  width: 300px;
}

In Less, we can also write it this way:

#header {
  color: black;
  .navigation {
    font-size: 12px;
  }
  .logo {
    width: 300px;
  }
}

Partials

.foo {
  background: #900;
}
@import "this-is-valid.less";

@import statements may be treated differently by Less depending on the file extension:

@import "foo";      // foo.less is imported
@import "foo.less"; // foo.less is imported
@import "foo.php";  // foo.php imported as a Less file
@import "foo.css";  // statement left in place, as-is

Mixins

.a, #b {
  color: red;
}
.mixin-class {
  .a();
}
.mixin-id {
  #b();
}

outputs

.a, #b {
  color: red;
}
.mixin-class {
  color: red;
}
.mixin-id {
  color: red;
}

Extend

nav ul {
  &:extend(.inline);
  background: blue;
}
.inline {
  color: red;
}

outputs

nav ul {
  background: blue;
}
.inline,
nav ul {
  color: red;
}

Operators

// numbers are converted into the same units
@conversion-1: 5cm + 10mm; // result is 6cm
@conversion-2: 2 - 3cm - 5mm; // result is -1.5cm

// conversion is impossible
@incompatible-units: 2 + 5px - 3cm; // result is 4px

// example with variables
@base: 5%;
@filler: @base * 2; // result is 10%
@other: @base + @filler; // result is 15%

Stylus

2011/01/31 version: 0.0.1 current release: 0.54.5

https://github.com/stylus/stylus

Expressive, robust, feature-rich CSS language built for nodejs

$ npm install stylus -g
$ stylus -w style.styl -o style.css

Syntax

記法は、sassをさらに簡略化した感じ。でも、sass, scsss, less, css の書き方もできる。

#stylus
    background #eee
    padding 10px
    margin 0 0 10px
    h2 
      font-size 30px
      color blue
    .bikou
      font-size 0.8em
      &:before
        content "※"

Variables

font-size = 14px

body
 font font-size Arial, sans-serif

Partials

@import "reset.css"

Along with @import, Stylus also has @require. It works almost in the same way, with the exception of importing any given file only once.

Mixins

border-radius(n)
  -webkit-border-radius n
  -moz-border-radius n
  border-radius n

form input[type=button]
  border-radius(5px)

Compiles to:

form input[type=button] {
  -webkit-border-radius: 5px;
  -moz-border-radius: 5px;
  border-radius: 5px;
}

Extend

scss の@extendとほぼ一緒

  .message {
    padding: 10px;
    border: 1px solid #eee;
  }

  .warning {
    @extend .message;
    color: #E2E21E;
  }

Operators

 .
 []
 ! ~ + -
 is defined
 ** * / %
 + -
 ... ..
 <= >= < >
 in
 == is != is not isnt
 is a
 && and || or
 ?:
 = := ?= += -= *= /= %=
 not
 if unless

結論

  • それぞれ結構違うと思ったら、ほとんど変わらず、どの言語で作られているかの違いでしかなかった。だから書き方とはだいたい一緒なので、使うときも苦労しないと思う。
    • ruby のprojectだったら、sass(scss)
    • それ以外ならless, stylus みたいな区分でいいかな、まあパフォーマンスとか周辺ライブラリも考慮しつつ。
    • lessは、コマンドのoption・仕様全体から言って、sassに比べて多機能な感じがする。でも書き方はscssに似てる。
    • stylusは、書き方をかなり簡略化したい場合とかに、使えそう。
--- sass(scss) less stylus golang/go
github star count 10843 15289 8708 35647
github watch count 677 752 376 2604
github fork count 1923 3458 1007 4874
made of ruby NodeJS NodeJS golang

ベンダープレフィックスなどの記述をラクにするもの。

sass → compass less → nib

Reference from

TCP/IP

コンピュータネットワーク発展の7つの段階

---
1950 バッチ処理(処理するプログラムやデータなどをまとめて一括で処理する方式)
1960 タイムシェアリングシステム(TSS):一台のコンピュータに複数の端末を接続し、複数のユーザーが同時にコンピュータを利用できるようにしたシステム
1970 コンピュータ間通信
1980 コンピュータネットワーク
1990 インターネット普及
2000 インターネット技術中心
2010 TCPIP

プロトコル

例、IP TCP HTTP

  • コンピュータとコンピュータがネットワークを利用して通信するために作られた約束事

日本語英語 プロトコル 言語によるコミュニケーション 通信 話の内容 データ

通訳 ゲートウェイ

  • パケット交換とは 大きなデータをパケットと呼ばれる単位に分割して送信する方法

小包の荷札=パケットのヘッダ

OSI

ISOが国際標準としてOSIと呼ばれる通信体系を標準化 OSI:開放型システム間相互接続

上位層と下位層の間でサービスのやりとりをするときの約束事=インターフェイス 同じ階層=プロトコル

各層で何をするかという役割を定義 各層の役割を定義しているのがプロトコル

OSIの用語 ノード=通信を行うコンピュータ TCP/IPの用語 ホスト=ネットワークに接続されたコンピュータ

上位層から渡されたデータに自分の階層のプロトコル処理に必要な情報をヘッダという形で受け付ける。

  • プレゼンテーション層 ネットワーク全体で統一された表現形式とコンピュータやソフトウェアに適した表現形式を相互に変換する階層 符号化形式 UTF-8 shift_JIS

https://gyazo.com/0c55d7abe0f746b6d0b7286a697f0b3c

https://gyazo.com/a704557a6162b87c1cc69e490f8ef18e

  • コネクション型 tcp データの送信を開始する前に送信ホストと受信ホストの間で回線の接続をする 必ずしもパケットにはならない 電話みたいな感じ

  • コネクションレス型 ip パケットが多い 郵便 通信相手がいるかどうかの確認はない

  • 回線交換 交換機がデータの中継処理、交換機を通して回線を設定、回線接続=コネクションの確立、一度コネクションを確立するとその回線は占有利用(デメリット) 通信の速度が一定

  • パケット交換(蓄積交換) パケット交換機(ルータールーター、バッファと呼ばれる記憶領域、キュー(行列)を作りながら、バッファに格納 回線は一つ、共有利用、遅くなったりする

  • ユニキャスト:電話

  • ブロードキャスト:TV

  • マルチキャスト:テレビ電話

  • エニーキャスト:DNSのルートネームサーバー

  • アドレスの唯一性 階層性のあるアドレス=IPアドレス 階層性のないアドレス=MACアドレス

IPアドレス:ネットワーク部とホスト部

  • アドレスの階層性 ネットワークの途中にある通過点で各パケットの宛先アドレスを見て、どのネットワークインターフェイスから送り出すか決める =macアドレス 転送表 =IPアドレス 経路制御表

ネットワーク構成要素

コンピュータ機器の外部インターフェイス=ポート

パケットin データリンク層=フレーム

https://gyazo.com/f3d796cecf97398770c6943cdead457a

  • ネットワークインターフェイス NIC(LANを使うための機能が集約された部品)

  • リピーター(物理層) 減衰して変形した信号の波形を増幅、整形して流す装置、速度を変換することはできない

  • ブリッジ(レイヤ2、物理層) ネットワークとネットワークを結ぶ橋、どのネットワークにどのフレームを流すか

  • ルーター(レイヤ3、ネットワーク層) 経路を決定してパケットを配送する配達屋

  • レイヤ4−7スイッチ 4−7層の内容を分析して、特定の処理を行う。 ロードバランサー:複数のサーバーに負荷を分散する 帯域制御:電話を優先して、メールとかを後回しにする

  • ゲートウェイ トランスポート層からアプリケーション層までの階層でデータを変換して中継する装置のこと プロトコルの翻訳 中継

実際のネットワーク

  • バックボーン,コア:大量のデータを高速に送受信することを目的にして、構築。 例、道路網の高速道路

  • エッジ 高速なレイヤ3スイッチ 例、インターチェンジ

  • アクセス・アグリゲーション レイヤ2スイッチ、レイヤ3スイッチで、エッジを越えてやりとりする情報とネットワーク内に留まる情報を制御している 例市街地

  • データセンター 巨大なサーバーとストレージ、ネットワーク

DNS(ネットワーク層)

  • ホスト名→hostsファイルを参照(ホスト名とIPアドレス)→IPアドレスに変換 hostsファイルはネットワークインフォメーションセンターで一括管理

  • DNS:ホストを管理している組織がホスト名とIPアドレスの関係を表すデータベースを管理できる 通信をしたいユーザーがホスト名(ドメイン名)を入力すると自動的にホスト名やIPアドレスが登録されているデータベースサーバーが検索され、そこからIPアドレスの情報を得るようになっている。

    $ nslookup コマンド名
    ipアドレスがわかる

  • ドメイン名:ホストの名前や組織の名前を識別するための階層的な名前、サブドメインはホスト名とドメイン名の間に入る kusa.ac.jp pepper.kusa.ac.jp piyo.kusa.ac.jp

kusa: くさ大学固有のドメイン名 ac: 高等教育機関 jp: 日本 pepper, piyo: ホスト名

階層構造を取っているため、各組織単位で自由にホスト名を ネームサーバーとは、ドメイン名を管理しているホストやソフトウェアのこと、そのネームサーバが設置された階層のドメインに関する情報を管理する。 管理する階層のことをzoneと呼ぶ リゾルバ:DNSに問い合わせを行うホストやソフトウェア(自分のパソコン)

https://gyazo.com/c5011796c21f0e64f485341052e799b6

https://gyazo.com/916a24818db9de4049901d134127e952

DHCP(ネットワーク層)

面倒なIPアドレスの設定の自動化や、一括管理を行うことができる プラグアンドプレイ

DHCP○○パケットを送信するときは、IPアドレスは決まっていないので、送信元が0.0.0.0で送信先が255.255.255.255になっている。

複数のDHCPサーバーの設定を行ってくれるもの=DHCPリレーエージェント

https://gyazo.com/0e81c863d506f72642af555c9e2fbf66

https://gyazo.com/a0a6b5eccc02f265ce91ec62ea592160

ポート番号(トランスポート層

  • データリンク→macアドレスは同一のデータリンクに接続されたコンピュータを識別するためのもの
  • IP→IPアドレスTCP/IPネットワーク上に接続されているホストやルーターを識別するためのもの
  • トランスポート→ポート番号は同一のコンピュータ内で通信を行なっているプログラムを識別するためのもの 送信元IPアドレス・宛先IPアドレスプロトコル番号・送信元ポート番号・宛先ポート番号 で通信が識別される

ポート番号の決め方 - 標準→ウェルノウンポート番号(サーバー側)1024~49151 - ダイナミック→クライアントのOSが決める(クライアント側)複数のプラウザを開いたときとか

  • ポート番号は使用されるトランスポートプロトコルごとに決定される
  • ウェルノウンポート番号はトランスポートプロトコルに関係なく同じ番号が同じアプリケーションに割り当てられる

https://gyazo.com/84b57e0b7cadfb6a486cb11ceb3f1a2d

遠隔ログイン(5,6,7)

遠隔ログインはTSSのような環境を実現するアプリケーション。メインフレームと端末の関係をコンピュータネットワークに応用 - telnet:tcpのコネクションを一つ利用、この通信路を通して、相手のコンピュータでコマンドが実行される。ルーターや高機能スイッチなどのネットワーク機器にログインしてその機器の設定を行うときによく使われる。自分のログイン名とパスワードがその機器に登録されている必要がある。

https://gyazo.com/c5d8c82ebd5cd9678be2d21b31881f96

  • ssh:通信内容が暗号化された遠隔ログインシステム

https://gyazo.com/d24623338ff67443d14e9063b5fc4387

ftp - コンピュータ間でファイルを転送するときに使われるプロトコル。相手先コンピュータにログインする必要がある。 (インターネット上にある誰でもログインできるanonymous ftpサーバー) 二つのTCPコネクションを利用 - 制御用(ログイン、転送するファイル名、転送の方法)ポート番号21 - データの転送用 ポート番号20 要求コマンドにASCII文字列が使われる

www(5,6,7)

  • wwwは、インターネット上のハイパーテキスト形式で参照できる情報提供システム
  • wwwの情報を画面に表示するクライアントソフトウェアを webブラウザと呼ぶ

  • 情報へのアクセス手段と位置の定義 URI

  • 情報の表現フォーマットの定義 HTML
  • 情報の転送などの操作の定義 HTTP
  • ホスト名 ドメイン名やIPアドレス
  • ポート番号 トランスポート番号

    $ telnet サーバー名・もしくはアドレス 80

  • CGIはwebサーバーが外部プログラムを呼び出すサーバーサイドアプリケーションの仕組み

  • RSSはwebサイトの更新内容に関する要約情報をやり取りするためのデータフォーマット(ページの要約を表示、検索の精度が高くなる)

暗号化技術の基礎

  • 暗号化ではある値を用意して、その値を使って、元のデータ(平文)に対して、一定のアルゴリズムによる変換を行い、暗号化データを作る。 逆に暗号化されたデータを元に戻すことを復号という。

  • 暗号化と復号に同じ鍵を使うのが、共通鍵暗号方式

  • 暗号化と復号化に一対の別々の鍵(公開鍵と秘密鍵)を使うのが公開鍵暗号形式 二つを組み合わせる ある情報(パスワード)、あるもの(電話番号)、ある特徴(瞳孔)を持っていることによる認証

「内部統制のためのアイデンティティ管理 導入や運用における落とし穴とは」を読んで

https://gyazo.com/c41385f78d10d5b8718befc7e9004537

予防的統制とは、各ユーザーの職務内容に応じて、適切なシステムに対する適切なアクセス権限の付与や剥奪を実施すること

発見的統制とは、各種システムに実際に格納されているアクセス権限設定を確認し、誤りがあればこれを修正する作業のこと

「ユーザー・プロビジョニングによって統制できないアクセス権限」(担当者が勝手にアクセス権限をいじったりしないということを証明することはできない)をも把握し、正しいアクセス管理が維持されていることを、はっきりと示していくことのできる体制が求められる。

多くの企業ではアクセス管理についての監査への対応を、手作業で行おうとしている→膨大なコストがかかる→アイデンティティ監査の自動化

例、サン・マイクロシステムズの「Sun Java System Identity Manager」では、企業としての内部統制のためのアクセス権限関連のルールに基づいて、統合管理されているすべてのユーザーのすべてのシステムに対するアクセス権を自動的に一括してスキャンし、ルール違反の設定が存在していないかどうかをレポートとして出力する。

多くの企業に見られる内部統制上の欠陥の例 → - システムの開発者が、業務処理を行える権限を持ったままの状態になっている - 財務システムについては適切なアクセス管理がなされていても、その下で動いているOSやデータベースへのアクセス権が十分に管理されていない - 退職した社員や、契約切れの外部コンサルタントのアクセス権が放置されている

「職務分掌」とは、組織においてそれぞれの職務が果たすべき責任(職責)や職責を果たす上で必要な権限(職権)を明確にするために、職務ごとの役割を整理・配分すること

職務分掌のチェック

企業としてはまず、職務分掌ルールを明確かつ詳細に定義する必要がある。その上で、これを現実のITシステムに適用していく作業をできるだけ自動化していかなければならない。

Sun Java System Identity Managerでは、まずスプレッドシート形式で書かれた職務分掌ルールを具体的なITの言葉に変換する機能を備えている。そしてこれに基づいて、定期あるいは随時の監査スキャンを自動的に行うことができる。このため手作業として残るのは、出発点となる企業としての職務分掌ルールを決めることだけだ。

アイデンティティ管理製品」とは銘打っていても、このようなルール変換機能や自動監査スキャン機能を通じた発見的統制が自動化できないのであれば、内部統制やコンプライアンスの検証作業は効率化できず、コストも減らすことができない。   - 拡張性の高いシステムであることの必要性 企業として利用する重要なシステムがくまなくカバーできてこそ、統合アクセス管理ソリューションとしてのアイデンティティ管理製品は活きてくる。 アイデンティティ管理システムに多様な操作権限を設定できるという点も重要

  • ワークフロー機能の充実 社内ルールに基づいて、本人が適切な他者を指名して承認の代行を明示的に申請し、承認者の上長の承認を得るようにするなどの対策が必要。 このようなシステムへのアクセス権限委譲に関するワークフローの機能。

  • アイデンティティ管理に関し、ログや証跡の保存とチェックが行えるようになっていること アイデンティティ管理が内部統制において重要な役割を担うということはすなわち、アイデンティティ管理作業自体の正当性も問われることを意味する。上記のアクセス権委譲に関する承認を含め、すべてのアイデンティティ管理作業は、第三者によるレビューのために記録されなければならない。

まとめ

アイデンティティ管理は、どんなものでもいいから製品を導入しさえすればよいというものではない。内部統制の観点からは、まず社内の職務分掌ルールの確立が求められる。さらに予防的統制、発見的統制を統合的に運用できる仕組みを採用することで自動化をはかり、PDCAサイクルを回していくことが肝要だといえる。

Reference from

Linux 実践入門

LINUXシステム実践入門

シェルはユーザーから入力された指示に従い、コマンドを実行し、結果を出力するプログラム。

$ コマンド 引数

コマンドはシステムに処理させる命令で、プログラムやシェルスクリプト、シェルのビルトイン(組み込み)コマンドの名前を利用

manファイルの検索

$ man ls | whatis chmod
chmod(1)                 - change file modes or Access Control Lists
chmod(2), fchmod(2), fchmodat(2) - change mode of file

$ man ls | apropos chmod
chmod(1)                 - change file modes or Access Control Lists
chmod(2), fchmod(2), fchmodat(2) - change mode of file
lchmod(3)                - change mode of file

manファイルにはNAME/名前のセクションにコマンド名と短い要約文が入っている whatis: 検索文字列として指定したコマンド名にマッチするmanファイルの要約文を表示 apropos:検索文字列をコマンド名と要約文から検索して表示する

$ info ls

パーミッション

xが付いてないと、そのディレクトリにアクセスできない→. のつくファイル . →今いるディレクトリを明示 ..→一つ上のディレクトリを明示

total 48
drwxr-xr-x 4 vagrant vagrant 4096 Sep 14  2012 .
drwxr-xr-x 3 root    root    4096 Sep 14  2012 ..
-rw------- 1 vagrant vagrant   22 Sep 14  2012 .bash_history
-rw-r--r-- 1 vagrant vagrant  220 Sep 14  2012 .bash_logout
-rw-r--r-- 1 vagrant vagrant 3486 Sep 14  2012 .bashrc
drwx------ 2 vagrant vagrant 4096 Sep 14  2012 .cache
-rwxr-xr-x 1 vagrant vagrant 6487 Sep 14  2012 postinstall.sh
-rw-r--r-- 1 vagrant vagrant  675 Sep 14  2012 .profile
drwx------ 2 vagrant vagrant 4096 Mar 13 09:13 .ssh
-rw-r--r-- 1 vagrant vagrant    0 Sep 14  2012 .sudo_as_admin_successful
-rw------- 1 vagrant vagrant    6 Sep 14  2012 .vbox_version
-rw------- 1 vagrant vagrant   12 Sep 14  2012 .veewee_version

一桁目はファイルタイプを表している。dはディレクトリ。

suid(set user id): ファイルの所有者権限でコマンドを実行できることを意味する sgid(set group id): ファイル→所有者権限 ディレクトリ→その親ディレクトリと同じ権限 で実行できる スティッキービット: 複数ユーザーでディレクトリを共有する際にsgidとは逆に作成したユーザーのみがファイルを削除できるようにするビット

デフォだとコマンドは実行されたユーザーの権限で実行される

実行ビット:x

suid はコマンドに設定されている所有ユーザー権限で実行される、マルチユーザーシステムであるUNIXでは運用側には便利な仕組み suidをむやみにコマンドに設定すると一般ユーザーが他人の権限でコマンドを実行できてしまうため、システムを某弱にしてしまう。

ファイル

データの最小単位はbit, 0と1 8つの bitを一つにまとめたものをbyteと呼ぶ byte=2の八乗=256 ASCIIの文字コードの一部を表現できる

$ man ascii

ディレクトリ(unix, linux)⇆ フォルダ(windows) 複数のファイルやディレクトリを一くくりにする入れ物のこと 一つ上のディレクトリ 親ディレクトリ 一つ下のディレクトリ 子ディレクトリ、サブディレクト

linuxディレクトリ構成

FHS(filesystem hierarchy standard):linuxディレクトリ階層標準化システム http://www.pathname.com/fhs/

マウント:HDDなどのブロックデバイス上にあるファイルシステムをシステムのディレクトリツリーの一部に配置す

パーティション あるHDDを複数の領域に分割してできた一つの領域のことを言う。

メリット ・システム領域とデータ領域を分けられる ・システム領域とデータ領域の他にlog領域を分けておくことで、万が一両方の残量が0になってもログ領域が残っていればなんとかシステムは起動できる

LVM

複数のパーティションをまとめて一つの論理ボリューム、パーティションとして見せることができる。残り領域が少なくなった際に拡張できる。

ホームディレクト

  • ファイル名はアルファベット
  • .から始まる設定ファイル以外はホーム直下に置かない
  • ダウンロードしたソースアーカイブを配置する srcディレクトリがある
  • リポジトリは個別にディレクトリを作る(git, svn, cvs
  • 一時ファイルディレクトリ(tmp)を用意する
  • ダウンロード、ビデオ、ピクチャー、ミュージックなどは、download, video, picture, musicからの新ボックリンク
  • 作業用ディレクトリ worksがありその下に案件ごとのサブディレクトリが存在する。

ディレクトリ構成

/ ルート

ディレクトリを格納するトップディレクトリ。vmlinuzというlinuxカーネル本体、linuxカーネルソースパッケージを配置することが推奨。

total 85
drwxr-xr-x  2 root    root     4096 Sep 14  2012 bin/
drwxr-xr-x  4 root    root     1024 Sep 14  2012 boot/
drwxr-xr-x 14 root    root     4160 Mar 13 09:13 dev/
drwxr-xr-x 79 root    root     4096 Mar 13 09:13 etc/
drwxr-xr-x  3 root    root     4096 Sep 14  2012 home/
lrwxrwxrwx  1 root    root       33 Sep 14  2012 initrd.img -> /boot/initrd.img-3.2.0-23-generic
drwxr-xr-x 19 root    root     4096 Sep 14  2012 lib/
drwxr-xr-x  2 root    root     4096 Sep 14  2012 lib64/
drwx------  2 root    root    16384 Sep 14  2012 lost+found/
drwxr-xr-x  4 root    root     4096 Sep 14  2012 media/
drwxr-xr-x  2 root    root     4096 Apr 19  2012 mnt/
drwxr-xr-x  4 root    root     4096 Sep 14  2012 opt/
dr-xr-xr-x 90 root    root        0 Mar 13 09:13 proc/
drwx------  2 root    root     4096 Mar 13 23:33 root/
drwxr-xr-x 16 root    root      680 Mar 18 07:11 run/
drwxr-xr-x  2 root    root     4096 Sep 14  2012 sbin/
drwxr-xr-x  2 root    root     4096 Mar  5  2012 selinux/
drwxr-xr-x  2 root    root     4096 Sep 14  2012 srv/
drwxr-xr-x 13 root    root        0 Mar 13 09:13 sys/
drwxrwxrwt  2 root    root     4096 Mar 18 08:17 tmp/
drwxr-xr-x 10 root    root     4096 Sep 14  2012 usr/
drwxr-xr-x  1 vagrant vagrant   136 Mar 13 09:13 vagrant/
drwxr-xr-x 11 root    root     4096 Sep 14  2012 var/
lrwxrwxrwx  1 root    root       29 Sep 14  2012 vmlinuz -> boot/vmlinuz-3.2.0-23-generic

/boot

linuxカーネル・init ram fsファイル・ブートローダGRUBの設定ファイルを含むディレクトリ。

total 23431
-rw-r--r--  1 root root   791023 Apr 11  2012 abi-3.2.0-23-generic
-rw-r--r--  1 root root   140279 Apr 11  2012 config-3.2.0-23-generic
drwxr-xr-x  3 root root     5120 Sep 14  2012 grub/
-rw-r--r--  1 root root 14731890 Sep 14  2012 initrd.img-3.2.0-23-generic
drwxr-xr-x  2 root root    12288 Sep 14  2012 lost+found/
-rw-r--r--  1 root root   176764 Nov 27  2011 memtest86+.bin
-rw-r--r--  1 root root   178944 Nov 27  2011 memtest86+_multiboot.bin
-rw-------  1 root root  2884358 Apr 11  2012 System.map-3.2.0-23-generic
-rw-------  1 root root  4965840 Apr 11  2012 vmlinuz-3.2.0-23-generic

/etc

設定ファイル(OSの設定に必要となるファイルやプログラムの設定ファイル)を格納するディレクト

/bin

システム管理者とユーザーによって利用されるコマンドが配置される(lsとか)。他のパーティションをマウントしなくても実行できるコマンドを集めている。

/sbin

システム管理者が利用するコマンド(システムのブートの一部、データバックアップ・リカバリパーティション調整・ネットワーク設定などのシステムメンテナンス、ユーザーの追加・削除、プロセスの監視などに必要なツール)が配置。

/usr

システムを利用するユーザで共有するデータを保持するディレクトリ。 /usr/local そのpc用のソフトウェアを配置するためのトップディレクトリ。

/home

ユーザーのhomeディレクトリとして扱い、システム利用者が利用するシェルの設定ファイルやメール、データファイルなどを配置。

/var

変わりやすいデータ(スプール(一時的に配置するファイルやディレクトリ)やログ)を配置するディレクトリ /tmp 別の一時ファイル置き場 /{log,spool} システムのいくつかのログが書き込まれるディレクトリ 各アプリケーションが一時ファイルを溜め込むスプールディレクトリ /mail MTA(SMTPサーバー、Mail Transfer Agent)で利用するディレクトリ /run デーモンなどのプログラムを実行する際に割り振られるプロセスID(PID)をテキストファイルとして保存、ソケットファイルなど一時データを保存する際に利用される。 /lock デーモンなどのプログラムの多重起動を防ぐための一時ファイルの保存 /{opt,cache,lib/{misc,locate},local} デーモンやログ以外で一時ファイル以外に利用するディレクトリが割り当てられる。

/proc(procfs)

linuxのプロセスを操作したりシステム情報を処理するための手段を提供する擬似ファイルシステム。 プロセスとカーネル情報を提供する仮想ファイルシステム

/sys(sysfs)

メモリ内ファイルシステムを通してユーザープロセスにカーネル情報を提供するための機能。 デバイス情報を提供する仮想ファイルシステム

/dev

特殊・デバイスファイルを配置するディレクトリ。

/tmp

システムで作業ファイルなどの配置に利用するディレクトリ。

シェル

https://gyazo.com/744812ffa7c8a41e17bed0d503516720

linuxカーネルLinuxディストリビューション(OSを構成する他のソフトウェアや、アプリケーションソフト、インストーラー等を含んでいる)

カーネル(kernel)とは、オペレーティングシステム(OS)の基本機能の役割を担うソフトウエアのこと カーネルは、OSの中でも特に中核的なプログラム このカーネルが、ハードディスクやメモリーなど、コンピューターの資源管理を行なっている

  • アプリケーションの起動
  • プログラム実行順序の変更
  • 変数の保持
  • 実行コマンド履歴の出力

シェルスクリプト:あらかじめコマンドを記述したテキストファイル

linuxのシェル四種類 - bash - csh/tch - dash - zsh

確認コマンド

$ ls -l /bin/sh

一般ユーザー $

⇅ $ sudo su # su 一般ユーザー名

管理者ユーザー #

ジョブ制御機能

複数のプログラムの実行・停止を管理するジョブ制御機能

ユーザーが見える画面 フォアグラウンドジョブ 背後で実行する バックグランドジョブ 停止中 サスペンドジョブ

$ jobs ジョブの一覧を表示。+はカレントジョブ ーその次のjob

^ + z → サスペンドジョブに bg → 指定したjob番号のプロセスをバックグラウンドで実行 fg → そのプロセスをフォアグラウンドに持ってきて稼働状態にする

https://gyazo.com/eb304b946c0e0829008aa50f38ea1712

リダイレクト プログラムの出力をファイルに書き込むこと 0<, 1>, >> をフィルディスクリプタを指定して、プログラムの入出力先を変更する。プログラムの処理結果をファイルに記録、ファイルに記述されている内容をプログラムに渡すのに利用。0は標準入力、1は標準出力、2は標準エラー出力

パイプ プログラムの出力を別のプログラムの入力に利用。

ビルドインコマンド

シェル自身が機能として持っているコマンド =シェルのビルドインコマンド(内部コマンド) 別に用意されたプログラムを外部コマンド

: 何もせずに終了コード0を返す

source もしくは .

現行シェル環境で他のシェルスクリプトを読み込んで実行する。

cd

指定したディレクトリに移動する 環境変数CDPATHを設定すると、cdのあとに移動するディレクトリ名を指定するだけで、そのCDPATHに含まれるディレクトリから移動先を検索する

$ export CDPATH=/var/lib
$ env | grep CDPATH
CDPATH=/var/lib
$ cd dpkg
/var/lib/dpkg

eval

パラメータの間接干渉をする(入れ子になった変数から値を取り出す)

https://gyazo.com/ff61aed4be66f63f813753f1728e9a03

exec

forkシステムコールを使わずに指定されたコマンドを自身で実行する。 通常シェルで外部コマンドを実行するとforkシステムコールを利用してシェルとは別にプロセスが生成され、コマンドを実行する。exec内部コマンドを利用するとforkシステムコールを使わないために別プロセスが生成されずシェル自身が指定されたコマンドに置き換わり実行される。execを使用しない場合、コマンドの実行後はシェルに実行が戻るが、execを使うと戻らない。

https://gyazo.com/b6257db0fe3cff2f66039db7c646e467

read

入力された文字列を指定した変数に取り込むコマンド。 https://gyazo.com/40b7c215c1d727ab33f009696a283798

https://gyazo.com/0ef6ff037286acc40406e63c07922def

シェル宣言

$ コマンド

デフォだと下記の順で以下の環境変数PATHの中から探していく。 https://gyazo.com/f1662ffae16a692c8aa43eaf359b7216

でも自分で作ったシェルスクリプトの場合パスを指定しないといけない。 例)./hello.sh

シェル変数

ユーザーが一時的に値を格納、参照し、起動しているシェル、シェルスクリプト内で利用できる変数 使用中のシェルで有効なシェル変数はsetコマンドで一覧表示できる。unsetを使うと削除できる。

環境変数

定義したシェルから起動したコマンドにも引き継がれる変数。 複数のコマンドで共有できる変数。 定義されている環境変数はenvコマンドで参照。 https://gyazo.com/e3424744716378f1f3a6e2664c01ea13

位置パラメータ

関数などで利用する引数参照に利用する変数 シェルスクリプトを実行する際に引数として値を渡したい場合がある。その値を取得するために使う。 $ cat -n count.sh 1 #!/bin/bash 2 echo $1 3 echo $2 4 echo $3 $ bash ./count.sh a b c d a b c

特殊パラメータ

引数すべてや引数の個数などを表す変数。特殊パラメータはスクリプト名や引数、プロセスIDなどを参照するための変数として利用できる。

https://gyazo.com/9ebd59aabf23a7494b205c6ed47ceb9b

if/while/for/case がある。

シェル関数

shift 位置パラメータを一つずつ移動 $ ./script.sh --version --help

どのタイミングでオプションが来ても対応できる https://gyazo.com/d5aade624226a0a280c604bb4e8a6b3b

""   $1 を特殊記号として扱う ''  テキストをシェルに展開されないようにして特殊記号をそのまま表示、利用できる シングルの方が外(例、'a"bb"')

` もしくは $() : 囲まれるとコマンドとして実行される

ログインシェル

0番目の引数の先頭文字が- --loginが指定されている場合に起動するシェル。 GUIで起動しなかったら、ログイン後に起動するシェルがログインシェル。

/etc/profile ~/.bash_profile ~/.bash_login ~/.bash_profile

対話シェル

ログインシェルでない状態のシェル ホームディレクトリの.bashrcが読まれる

bashの設定を有効化していく

 ユーザとグループ

システムユーザ デーモンを実行するために利用するユーザ

  • ユーザ作成コマンドの設定ファイル/etc/adduser.confなどでシステムユーザIDの範囲が決まっている
  • /etc/shadowを確認すると、システムユーザのパスワードは設定されていない。

一般ユーザ

管理者rootとシステムユーザが利用していないIDを適用されたシステムを利用するだけのユーザ パッケージのインストールなどを実施せず、システムにログインし、インストールされたコマンドを利用するユーザ

各ユーザはグループという所属を設定でき、最低一つはグループに入ることになっている。

unixアカウントを作成、変更する以外は、標準では同じ名前のグループが作成され、そこに所属する。

グループを利用するメリットは、システムリソースの利用制限を実施したり、権限の利用制限を設定できること。

/etc/password(unixアカウント情報が記録されている。)

unixユーザ名 パスワード ユーザID グループID コメント ホームディレクトリ シェル

/etc/shadow(暗号化したパスワードを格納する)

/etc/shadowは暗号化されたパスワードファイルを管理者権限でのみアクセスできるようにする仕組み。

https://gyazo.com/5022f3672f00b151d033155d8bcd8b44

パスワード欄

$id$salt$encrypted id: 利用するハッシュアルゴリズム salt: ユーザのパスワードと合わせて暗号化するためのフレーズ encrypted: IDで指定したハッシュアルゴリズムでハッシュ化したパスワード文字列 ! パスワードが設定されていない * アカウントロック !! パスワードの有効期限切れ

adduser/useradd ユーザの追加 deluser/userdel ユーザの削除 groupadd/groupdel グループの追加、削除 usermod ユーザアカウントの修正 groupmod グループアカウントの修正 passwd パスワード変更 change パスワード有効期限を変更 chsh シェルの変更 chfn 氏名情報変更

/etc/group

システムでのグループ定義を行うファイル

$ cat /etc/group
root:x:0:
グループ名:パスワード:グループID:ユーザ名…

/etc/gshadow グループ名:暗号化パスワード:管理者:メンバー

SSH

SSHポートフォワード

sshプロコトルはリモートシェルやファイル転送だけでなく、そのセッションに別のアプリケーションをカプセル化できる。これによって平文で通信する平文で通信するアプリケーションでも暗号化通信にできる。

https://gyazo.com/128b4cb37f0799fc1db937dbaeec55d2

sshサーバーを起動するには、sshdというデーモンプロセスを稼働させる。 sshdを起動するとデフォルトで、22/tcpを利用して、sshクライアントからの接続を待ち、クライアントから接続が来ると利用するSSHプロトコルのバージョンの交換から通信を始める。 Diffie-Hellman鍵交換によってセッション鍵を得る、そしてサーバーのホスト鍵とクライアントのユーザ鍵をお互いに交換する

  • クライアントにsshサーバーのホスト鍵が登録されている場合 問題なし

  • クライアントにsshサーバーのホスト鍵が登録されていない場合 sshサーバホスト鍵のフィンガープリントを表示して登録することの確認を表示

https://gyazo.com/6be4147543441e9bbfad10cdd155aea7

  • クライアントに登録されているsshサーバーのホスト鍵と異なる場合 man-in-the-middle攻撃の可能性があることを警告表示する

https://gyazo.com/b5b4c65487c11eb703e2aacd78e76f90

セッション鍵を得て暗号化通信を開始した後はサーバとクライアントの認証に入る、パスワード認証・公開鍵認証を利用してアカウントを利用するか判断。

https://gyazo.com/4c60b8392957d137bbfc6f181d777f1b

$ ssh [user@]hostname

認証が通ると、シェルの起動、コマンドの実行、xクライアントの転送などを実行してセッションを開始する

https://gyazo.com/a79e8932572beb41d3ee25749f0759de

http://qiita.com/tag1216/items/5d06bad7468f731f590e

$ ls -l /etc/ssh/
total 160
-rw-r--r-- 1 root root 125749 Apr  2  2012 moduli
-rw-r--r-- 1 root root   1669 Apr  2  2012 ssh_config
-rw-r--r-- 1 root root   2499 Sep 14  2012 sshd_config
-rw------- 1 root root    672 Sep 14  2012 ssh_host_dsa_key
-rw-r--r-- 1 root root    604 Sep 14  2012 ssh_host_dsa_key.pub
-rw------- 1 root root    227 Sep 14  2012 ssh_host_ecdsa_key
-rw-r--r-- 1 root root    176 Sep 14  2012 ssh_host_ecdsa_key.pub
-rw------- 1 root root   1675 Sep 14  2012 ssh_host_rsa_key
-rw-r--r-- 1 root root    396 Sep 14  2012 ssh_host_rsa_key.pub
-rw-r--r-- 1 root root    302 Jan 10  2011 ssh_import_id

moduli DH鍵交換に利用するデータ sshd_config sshデーモンが参照する設定ファイル ssh_host_key{,.pub} sshサーバーで保持するSSHホスト鍵 ssh_config SSHクライアントが参照するデフォルト設定ファイル

authorized_keysファイルは一行に1つの公開鍵を記述する

X11Forwarding

sshは必ずしもリモートホストにログインし、コマンドで操作するものではない。 sshログイン先のXクライアントアプリケーションをログイン元のXサーバに転送することができる。

https://gyazo.com/cb80ae3dfa4d5fa7ce39ff4037f590f9

http://qiita.com/kou_bacchus/items/47c40beb147a3040fe5e

SSHクライアント

管理者だけではなく開発者も開発サーバやデプロイ先サーバへのログインなどで多用するツールの一つ

以下の順序で読み込まれる sshコマンドラインオプション ユーザごとのオプション(~/.ssh/config)←ここに長いコマンドをまとめることができる システムのオプション(/etc/ssh/ssh_config) sshコマンドのデフォルトパラメータ

公開鍵暗号秘密鍵と公開鍵を作成し、公開鍵を配布して秘密鍵はユーザが厳重に保持して運用する暗号。 公開鍵と秘密鍵は同時に作られ、秘密鍵から公開鍵の生成、公開鍵から秘密鍵の生成はできない。鍵はアルゴリズムを利用して生成。

公開鍵

一般に公開 持ち主以外の送信者が暗号化に利用 持ち主以外の受信者が署名検証に利用 sshでログインする先のホストに登録して利用

秘密鍵

持ち主が保持 公開鍵で暗号化されたメッセージを秘密鍵で復号化するのに利用 作成したメッセージへの署名に利用 sshコマンド実行時に秘密鍵を指定することで公開鍵を登録したホストへのログインに利用

保持しているサーバの公開鍵と、サーバから送られてきた公開鍵が異なる場合 →SSHサーバの再インストールやリプレースなどでホスト鍵が変更された。(SSHサーバの再インストールやリプレースなどでホスト鍵が変更された。) →SSHサーバとSSHクライアントの間に第三者が入っている。(man in the middle攻撃)

SSHサーバは自身のホスト用公開鍵と秘密鍵を保持している。SSHクライアントはサーバの公開鍵を登録しておくことで、そのサーバが本当に接続対象のサーバかを判断できる。

SSHサーバ管理者に現在利用されている正しい公開鍵情報を提供してもらう SSHでログインするユーザが接続した際に表示される公開鍵のフィンガープリントを確認する

公開鍵認証

ユーザーはログインしたいホストに自身の公開鍵を保存する $ ssh-copy-id -i ~/.ssh/id_rsa sample@192.168.1.24

ssh-copy-idはリモートホストにログインできる状態でないと登録できない。 →リモートホストがパスワード認証を許可しているか既に公開鍵を一つ以上登録しており、SSHログインできることが条件。

リモートホストの管理者に公開鍵を渡して登録してもらう必要がある

sshサーバにおける公開鍵の設定

sshログインを受け付ける側の設定はSSHデーモンの設定変更で公開鍵認証を有効にして(/sshd_config)sshdを再起動する。

sshクライアントでのデバッグ→詳細を見ることでログインできない場合にデバッグできる $ ssh -vvv -l sample 111.111.1.11

cronは決められた時間にコマンドを実行するデーモン。

$ service cron status 
$ ps ax | grep cron
  • /etc/crontab cronデーモンへの指示書
  • /etc/cron.d 
  • /var/spool/cron/crontab ユーザー用cronファイル

https://gyazo.com/c3f3500a439fd2d70d32df838cbb2775

$ cat /etc/crontab (Ubuntu) # /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 ) #

分 時 日 月 曜日 実行ユーザ名 コマンドとそのオプション

$ crontab -l ユーザのcron設定ファイルのリストを表示 $ crontab -e ユーザのcron設定ファイルを作成

ここで生成されたファイルは/var/spool/cron/crontabs以下に配置される。

crontabには負荷が高くなる処理の実行を記述した場合のために、ユーザ単位でのアクセス制御が設定できる。

デフォルトでは存在しない/etc/cron.allow /etc/cron.denyというファイルを作成し、一行ごとに1アカウントだけ記述すればリストされたユーザのcrontabの実行を制御できる。

https://gyazo.com/c05bb893e18e1139afcd094cbffd5039

これらの設定によってcrontabの実行を拒否された場合は/var/log/cronにログとして記録される。

cron設定後の動作確認 実行するコマンドにechoやloggerを与え、そのコマンドが指定時刻に実行されるかをデバッグできる。

$ sudo cat /etc/cron.d/du 0 1 * * * root logger "du -hs $HOME"

以下のログを確認することで、変数が正常に展開されているか、指定した時刻に実行されているかなどが確認できる。 echoを使うと実行後にメールが飛んでくる

出力例 $ tail /var/log/messages Sep 25 01:00:01 ogasaka logger: du -hs /root

cronはすべての出力をMAILTO環境変数に指定した宛先、MAILTOがなければrootを宛先として実行後にメールを送信する。 適切に送信先を指定するのも重要だが、不必要な出力をしないことでメール送信しない様にし、エラー出力だけメールするという調整が重要

標準出力も標準エラー出力もメールしない

「du -hs \$HOME > /dev/null 2>&1」

標準出力をdev/nullにリダイレクトするので標準エラー出力だけメールを送信する

「du -hs \$HOME 1> /dev/null」

ログローテーション

カーネルや各デーモンからのメッセージを記録し続けると、ログファイルのサイズは拡大し、ファイルシステムのファイルサイズ制限に達してしまう。それを予防する仕組みがlogrotate。 logrotateはcron経由で起動し、指定されたログファイルを移動、圧縮して新しいログファイルを作成。必要があればデーモンの再起動。

cronが/etc/cron.daily/logrotateを読み込む logrotateが/etc/logrotate.confを設定ファイルとして起動し、logrotate.confに指定されたログファイルを処理する /etc/logrotate.d/以下のファイルを読み込み指定されたログファイルを処理する

https://gyazo.com/7f98f16bdb39fad439d95d5a4b71adf6

Apache HTTP Server

RHEL/CentOS httpd Debian/Ubuntu apache2

http://www.vogella.com/tutorials/ApacheHTTP/article.html

$ sudo apt-get install apache2

$ /etc/init.d/apache2 -l * Usage: /etc/init.d/apache2 {start|stop|graceful-stop|restart|reload|force-reload|start-htcacheclean|stop-htcacheclean|status}

←apache2の後に続けて書くことで、実行できるコマンドの一覧

ディレクティブとは、ディレクティブと値をそれぞれ設定して、記述していくもので、範囲を指定できるものもある。

$ cat /etc/apache2.conf

コメントは省略

55 LockFile ${APACHE_LOCK_DIR}/accept.lock

62 PidFile ${APACHE_PID_FILE} 

プロセスIDを記録するファイル

67 Timeout 300

getリクエストの受け取りを待ち、post/putメソッド利用で次のtcpパケットが届くのを待ち、サーバがクライアントにレスポンスを返すのに、TCPでクライアントからのackが返ってくるまでの待ち時間に関する制限を秒数で指定する。

73 KeepAlive On ←環境によってチューニング

HTTPの持続的な接続を有効にする。例えばブラウザからあるページを要求された場合、そのページにリンクされていた画像についてもWebサーバにリクエストを送信する。HTML以外にも複数画像ファイルに対してGETメソッドを送信するのに、TCPコネクションを貼り直すが、 tcpコネクションを接続したままでHTTPメソッドを送信できれば、送受信パケットを抑えることができる。このコネクションをKeepAliveTimeoutディレクティブで指定された秒数だけ待つ。帯域の狭い環境ではKeepAliveをonにするのは効率的だが、広帯域の場合はKeepAliveをoffにしないとすでに使っていないプロセスが無駄に残ってシステム負荷になる可能性がある。

80 MaxKeepAliveRequests 100 86 KeepAliveTimeout 5

MPMとはクライアントからのリクエストの処理方法をモジュールに分けたもの。event mpm_netware prefork worker

利用するMPMの選択、チューニングはその上で利用するサーバサイド言語やwebフレームワーク、アクセス数、稼働するサーバのメモリ容量によって調整。

98 このモジュールが組み込まれている場合に指定したパラメータが有効になる StartServers 5 起動時に用意する子プロセス数 MinSpareServers 5 待機する子プロセスの最小値 MaxSpareServers 10 待機する子プロセスの最大値 MaxClients 150 ServerLimitとMaxClientsは作成するサーバプロセスと子プロセスの最大数で同じ数値を設定 MaxRequestsPerChild 0 子プロセスが扱えるリクエストの最大値を指定 104

preforkはクライアントからの1リクエストに1プロセスで対応するためにforkシステムコールを使って子プロセスを生成。forkでの子プロセス生成はメモリを独立して利用。アクセス数に応じて子プロセスを増やしていく。

116 StartServers 2 MinSpareThreads 25 MaxSpareThreads 75 ThreadLimit 64 ThreadsPerChild 25 MaxClients 150 MaxRequestsPerChild 0 124

133 StartServers 2 MinSpareThreads 25 MaxSpareThreads 75 ThreadLimit 64 ThreadsPerChild 25 MaxClients 150 MaxRequestsPerChild 0 141

eventMPMはworkerMPMをベースにしているが、処理している接続だけをマルチスレッドで行うことで効率的に処理するマルチプロセッシングモジュール。

144 User ${APACHE_RUN_USER} 145 Group ${APACHE_RUN_GROUP}

httpdを実行するユーザを指定する。

153 AccessFileName .htaccess 159  ファイルの先頭が.htで始まるファイル名を意味している Order allow,deny  Deny from all Satisfy all 163

デフォルトでは.htaccessが分散設定ファイル名に設定されている。

181 DefaultType None

192 HostnameLookups Off

ipアドレスでログに書き込むという指定

200 ErrorLog ${APACHE_LOG_DIR}/error.log

エラーログを記録するファイル名

207 LogLevel warn

記録するログの粒度を占める記述。デフォはworn

「 210 Include mods-enabled/.load 211 Include mods-enabled/.conf 214 Include httpd.conf 217 Include ports.conf 」他のファイルのの読み込み

224 LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined 225 LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined 226 LogFormat "%h %l %u %t \"%r\" %>s %O" common 227 LogFormat "%{Referer}i -> %U" referer 228 LogFormat "%{User-agent}i" agent

ログへの記録フォーマットを定義

234 Include conf.d/ 237 Include sites-enabled/

Gemfileのバージョン指定の書き方

  • 1.0.0 バージョンを固定。
  • >= 1.0.0 1.0.0以上のバージョンが必要
  • >= 1.0.0, < 2.0.0 1.0.0以上、2.0.0未満のバージョンが必要、ex) 1.x.x
  • ~> 1.0.0 1.0.0以上で利用可能で、1.0.9などは問題なく、1.1にバージョンが上がると利用不可 ex) 1.0.x

reference from