読者です 読者をやめる 読者になる 読者になる

_J Blog

学んだ事のまとめやメモなどが中心です

nginxのserver_nameを複数設定する

Nginxつかってて、vhostをきりたいときで、同一の名前で同じディレクティブで受けたいときってありますよね。

そういうときって、 server_name に複数並べて、下記みたいに書くと思います。

server {  
    listen       80;  
    server_name  example.org  www.example.org;  
    ...  
}

ここで、この server_name は上限どれくらいかな?
って気になったので調べた。

公式ドキュメント

Module ngx_http_core_module

server_names_hash_max_sizeserver_names_hash_bucket_size を増やせばいいみたい。

server_names_hash_max_size は デフォルトだと 32 らしい。

server_names_hash_max_size から増やしていけって書いてあった。

AWS Web Console から各IAMユーザー自身でパスワード変更およびMFAを設定できるIAM Policy

普段AWSのWebコンソールを利用していると、IAMで権限管理している人が多いと思います。

よくあるケースとして、IAMユーザーを新規発行してあげたときに、他の人にアカウントを作って初期パスワードを教えてあげたけど、その後はそのユーザー本人が自分でパスワードの変更やMFAの設定をしてほしいな思いました。

こんなとき、権限管理はちゃんとしたいから、余計な権限をあげたくないけど、どんな権限を与えたらいいのか分からなかったので、

Web コンソールからIAMユーザー本人がIAMユーザーのパスワードとMFAの設定をできる

という権限を設定できるIAMポリシーを作りました。

下記のようになります。
※ <account-id>の部分をあなたのAWSアカウントIDに置き換えてください

gist7486986

Policyの中にある ${aws:username} みたいなのは IAM Policy Variables といってユーザー名などを動的に取得する事ができる記述方法です。
IAM Policy Variables について 詳しい説明はこちら。
IAM Policy Variables Overview - AWS Identity and Access Management

本日は以上です。

P.S. AWSってアドベントカレンダーないのかな?

AWS Policy Simulator で簡単 IAM Policy チェック

ついに満を持して(?)リリースされましたね!

AWS Policy Simulator !!

Amazon Web Services ブログ: 【AWS発表】 AWS Identity and Access Management (IAM) Policy Simulator
※ちなみに、ここで紹介されている説明動画はすごく分かりやすいです。

よく IAM Policy で「これ、うまく設定できてる?」というのが試すまで分からない事が多いので、とてもうれしいですね。

早速ですが使ってみました。

新規作成するため、AWS Policy Generator を一旦利用します。
AWS Policy Generator
※ここはIAMのタブの新規作成でもいいです。

適当に入力して、

f:id:jimsei:20131107024728p:plain

とりあえず、こんなポリシーができました。

{
  "Statement": [
    {
      "Sid": "Stmt1383759642380",
      "Action": [
        "ec2:DescribeInstances",
        "ec2:StartInstances",
        "ec2:StopInstances"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:ec2:ap-northeast-1:{your-account-id}:instance/*"
    }
  ]
}

ここでは、「ec2:DescribeInstances」,「ec2:StartInstances」,「ec2:StopInstances」の3つを自分のアカウントのEC2インスタンスに対して許可しています。

では早速 Policy Simulator をつかっていきます。

画面を開き、右側上部のセレクトメニューから「Mode:New Policy」 を選択して、

f:id:jimsei:20131107024720j:plain

左側の「Policy Sandbox」に上記の Policy をペーストして、「Apply」を押します。

f:id:jimsei:20131107030731p:plain

次に、右側の「Policy Simulator」で 「Amazon EC2」 を選択し、矢印のドロップダウンから、 「DescribeInstances」,「StartInstances」,「StopInstances」,「TerminateInstances」にチェックを入れます。

f:id:jimsei:20131107031930p:plain

「Simulation Settings」をクリックし、「Resource Name Format」に「arn:aws:ec2:ap-northeast-1:{your-account-id}:instance/*」(ここでは自分のアカウントのEC2インスタンスを対象にPolicyの効力をチェックしたいので)と入力して「Run Simulation」を押します。

f:id:jimsei:20131107032724p:plain

すると、先ほど許可していた、「DescribeInstances」,「StartInstances」,「StopInstances」の箇所に 「allowed」の文字が!
許可していない「TerminateInstances」には「denied」の表示がされ、このPolicyではインスタンスのTerminateができない事を表しています。

f:id:jimsei:20131107033039p:plain

このような感じで簡単にPolicyをチェックする事ができました!

AWSはツールも充実していって、どんどん便利になっていきますね!

これからもどんどんAWS使っていきます。

もうちょっとIAMネタを書くかな・・・

Gitのフックスクリプトが実行されてないかも?というとき

色々原因はあると思いますが、その中の一つではまったものを紹介します。

それは

exec git update-server-info

です。
これがあるとその行以降のコマンドは実行されません。

まず最初に結論から

どうすれば良いか。 exec を消して

git update-server-info

とします。
※ http(s) ごしでリポジトリにアクセスしない場合は消してしまっても良いです。

stack over flow の記事

ちょっと説明

gitのbareリポジトリ作ったばっかりの状態のhookscriptでは

post-update.sample

#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".

exec git update-server-info

みたいな感じでなってる。

たとえば何かを編集したときに、

#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".

exec git update-server-info

echo 'hogehoge'

みたいな感じで書いちゃうと、

echo 'hogehoge'

の部分が実行されません。 それは

exec git update-server-info

があるからです。

exec コマンドとは

execに指定したコマンドを実行する。このコマンドを実行する際に、新しいプロセスを作成せずに、現在のジョブと置き換えて実行される。

というものです。

execコマンドの説明記事

ですので、

exec git update-server-info

の時点で終わってしまい、

echo 'hogehoge'

が実行されないのです。

お気をつけください。

Ruby の aws-sdk を使って色々操作する-その1

最近、AWS を触っています。
私は Ruby を使いがちなので、Ruby の aws-sdk をつかって 様々な操作をする事が多いです。

その中でいくつか決まった書き方をする事が多いので、少しづつやり方をまとめておきます。

■自らのEC2インスタンス情報を取得する(EBSのVolumeIDなどもここから取れる)

require 'aws-sdk'

# 設定(IAM Roleなどを利用しているときは key と secret はいらない)
AWS.config(
  access_key_id: 'REPLACE_WITH_ACCESS_KEY_ID',
  secret_access_key: 'REPLACE_WITH_SECRET_ACCESS_KEY',
  ec2_endpoint: 'ec2.ap-northeast-1.amazonaws.com'
)
# defaultは us-east-1 です
# 東京リージョンであれば下記のように
ec2 = AWS::EC2.new(region: 'ap-northeast-1')

# meta-dataサーバーから自身のinstance_idを取得
instance_id = `curl -s http://169.254.169.254/latest/meta-data/instance-id`
# インスタンス情報を取得
instance = ec2.instances[instance_id]

少しづつ増やしていこうと思います。
また書きます。

GitoliteをつかってGitリポジトリを権限管理する


やりたかった事

対象のGitのリポジトリ
 ・限られたユーザーにしかPUSHさせたくない
 ・誰でも閲覧できるようにしたい
という事がありました。


この事を解決する手段として、


1.sshプロトコルを利用し、ユーザーとグループで管理する
2.ツールを使う
 Gitosis、Gitolite、etc...

が真っ先に思いついたのですが、
Gitリポジトリのあるサーバーに、ユーザーとグループたくさん作るのも嫌だったので、
ツールを使う事にし、今回はGitoliteを利用する事にしました。


導入手順

つらつらと書きます。
※下の方に入れる途中で起きたエラーと解決策を書いてあります

まずgitユーザーを作成して、sudo権限をつけておきます。
※sudoつけずにrootで作業してもいいです。


gitユーザーでの作業

gitユーザーになります

ソース取得

cd /usr/local/src
sudo git clone git://github.com/sitaramc/gitolite.git
cd gitolite

パスの通ってる所にシンボリックリンク作成

./install -ln /usr/local/bin

$HOME/.ssh に移動(ディレクトリがなければ作成する)

mkdir  ~/.ssh
cd ~/.ssh

秘密鍵・公開鍵の作成

ssh-keygen -t rsa -f gitolite_id_rsa

gitoliteのセットアップ

gitolite setup -pk ~/.ssh/gitolite_id_rsa.pub 

ssh configの設定

vim ~/.ssh/config
# ~/.ssh/config
host localhost
  user gitolite
  hostname localhost (ここはサーバーのIP. 外部ならそれを指定)
  port 22
  identityfile ~/.ssh/gitolite_id_rsa

ssh 周りの権限変更

chmod 600 ~/.ssh/*
chmod 700 ~/.ssh

clone する

cd ~
git clone gitolite@localhost:gitolite-admin ・・・(1)


別ユーザーを作成して試してみる

tomユーザー作成

sudo useradd tom
su - tom

<span class="deco" style="font-weight:bold;">
tomユーザーでの操作
</span>

鍵の作成
>|cterm|
mkdir .ssh
cd .ssh
ssh-keygen -t rsa -f tom ・・・(2)

ssh 設定ファイル作成

vim ~/.ssh/config
# 基本的にidentityfile以外 管理者の設定と同じ
host localhost
  user gitolite
  hostname localhost
  port 22
  identityfile ~/.ssh/tom

ssh周りの権限設定

chmod 600 ~/.ssh/*
chmod 700 ~/.ssh


ユーザー追加作業(gitユーザーでの操作)

cd {(1)でcloneしたgitolite-adminリポジトリ}
vim keydir/tom.pub (ここは追加したいユーザー名 + .pub という名前でファイルを作る)
# keydir/tom.pub
(2)で作成した公開鍵の内容をコピー


リポジトリ権限の設定

tomユーザーにはtestingリポジトリに書き込み権限のみ与える

vim conf/gitolite.conf
# conf/gitolite.conf
# 一応グループを定義
@developer = tom

repo gitolite-admin
    RW+ = gitolite_pub_rsa

repo testing
    RW+ = gitolite_pub_rsa
    R = @developer

ファイルをpushする
※gitのuser.nameとuser.emailを設定していないときは
※git config --global user.email "you@example.com" と git config --global user.name "Your Name" でgitの設定しておくこと

git add keydir/tom.pub conf/gitolite.conf
git commit -m 'add tom key file and add testing repository permission of tom'
git push origin master

tomユーザーでの操作
testingリポジトリをcloneする

cd ~
git clone tom@localhost:testing

編集してpushしてみようとする

cd testing
echo 'hoge' > README
git add README
git commit -m 'first Tom's commit'
git push origin master

すると下記のように出力され、pushに失敗する

FATAL: W any testing tom DENIED by fall thru
(or you mis-spelled the reponame) 
atal: The remote end hung up unexpectedly 

pushできない事を確認できた。



これで一旦完了です。

実際に導入してみて、今のところうまく行っています。
これから運用フェーズだなー。。。


*** 番外編 ***(トラブルシューティングなど)


1. gitoliteの install -ln /usr/local/bin が エラー

こんなメッセージが出たとき

Can't locate Time/HiRes.pm in @INC (@INC contains: /home/gitolite/src/gitolite/src/lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /home/gitolite/src/gitolite/src/lib/Gitolite/Common.pm line 76.

BEGIN failed--compilation aborted at /home/gitolite/src/gitolite/src/lib/Gitolite/Common.pm line 76.
Compilation failed in require at gitolite/install line 15.
BEGIN failed--compilation aborted at gitolite/install line 15.


解決した方法:perlのモジュールをいれる

yum install perl-Time-HiRes -y


2. ssh で Permission denied が出るとき

基本的に /var/log/secure を確認すれば分かる事が多い
みてみましょう


3. ユーザーでcloneしようとしたら、pemの設定してあるのにパスワード聞かれる

/var/log/secure に User gitolite not allowed because account is locked ってでてるときは

vim /etc/ssh/sshd_config
#UsePAM no # <- こっちをコメントアウト
UsePAM yes

上記のように UsePAMを有効して sshdを再起動すると直った


4. リモートクライアントからの接続の場合でpassword聞かれてしまう場合

下記リンクを参考に
http://blog.teapla.net/archives/1843

Host gitolite・・・(3)
    User gitolite
    Hostname gitserver
    IdentityFile ~/.ssh/id_rsa.gitolite

のように設定していたとき、

git clone gitolite@gitserver:testing

とやるとパスワード聞かれてしまうけど、


git clone gitolite:testing

↑ (3) .ssh/config の Hostに設定したとこの名前

とするとパスワードなしでちゃんといけた。


5. リポジトリの場所変えたい

下記ドキュメントを参考にした
http://sitaramc.github.com/gitolite/dev-notes.html

デフォルトでは gitolite setup --pk xxxxx.pub を実行したユーザーのホームディレクトリになる

~/.gitolite.rc の%rc 内に
GL_REPO_BASE => 'path/to/repo'
を書くと変えれる

ソース的にはこの辺
/usr/local/src/gitolite/src/lib/Gitolite/Setup.pm


6. 大元のadminレポジトリを変える

大元は ~/.gitolite/ いかにあるが、
これは~/.gitolite.rc の GL_ADMIN_BASE に値を設定すれば変更できる

setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)

Ubuntuで怒られてた。

$ sudo locale-gen ja_JP.UTF-8
$ sudo update-locale LANG=ja_JP.UTF-8

で解決しました。