Пишем логи IIS в MSSQL

Цель: организовать хранилище логов IIS под управлением MSSQL.

Условия:

  • Для удобного поиска (SELECT’а) по времени значение date и time должны храниться в одном поле
  • Каждая запись должна иметь уникальный ключ
  • При переносе логов в MSSQL должен использоваться BULK insert.
  • Вставка логов производится за предыдущий день.

Сразу оговорюсь, что напрямую писать логи в MSSQL не используя сторонний софт не получится. Поэтому я написал небольшую консольную программу IIS2SQL, которая удаляет из файла лога закомментированные строки и форматирует поля date и time в одно поле для дальнейшей bulk-вставки. У Microsoft есть аналогичная программа preplog, но она только удаляет закомментированные строки.

Итак, давайте для начала включим логирование в формате W3C. Я включу логирование для всех своих сайтов. В настройках вы можете указать необходимые поля для логирования.

Теперь необходимо создать необходимую базу и таблицу. Если вы уже гуглили данный вопрос, то обратили внимание, что в сети есть куча руководств и структура таблиц в них может отличаться. Поэтому мы будем делать свою таблицу на основании логов которые нам отдает IIS. Открываем любым текстовым редактором (лучше блокнот не использовать,т.к. велика вероятность что он зависнет) файл логов и смотрим на 3 строку. В ней мы и найдем заголовки полей, которые нам необходимо будет создать.

В моем случае это #Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status time-taken. Не забывайте, что одно из условий было объединение полей date и time, поэтому создадим соотвествующую табличку. Обратите внимание на то, что я в таблицу добавил автоинкрементное поле Id.

USE [v2_prod_logs]
GO

/****** Object:  Table [dbo].[m_IIS_Log]    Script Date: 10/01/2015 15:25:55 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[m_IIS_Log](
	[Id] [bigint] IDENTITY(1,1) NOT NULL,
	[DATETIME] [datetime] NULL,
	[s-sitename] [varchar](60) NULL,
	[s-ip] [varchar](16) NULL,
	[cs-method] [varchar](8) NULL,
	[cs-uri-stem] [varchar](255) NULL,
	[cs-uri-query] [varchar](2048) NULL,
	[s-port] [varchar](16) NULL,
	[cs-username] [varchar](16) NULL,
	[c-ip] [varchar](16) NULL,
	[cs(User-Agent)] [varchar](1024) NULL,
	[cs-host] [varchar](60) NULL,
	[sc-status] [int] NULL,
	[sc-substatus] [int] NULL,
	[sc-win32-status] [int] NULL,
	[time-taken] [int] NULL,
 CONSTRAINT [PK_m_IIS_Log] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

Проблема в том, что если формат лога не соответствует вашей таблице, то BULK-insert из файла не получится. Поэтому вставку в таблицу мы будем делать во View. Создадим новый View для этой БД, исключив поле Id.

USE [v2_prod_logs]
GO

/****** Object:  View [dbo].[ViewIISLog]    Script Date: 10/01/2015 15:29:10 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

Create view [dbo].[ViewIISLog]
as Select [DATETIME],
	[s-sitename],
	[s-ip],
	[cs-method],
	[cs-uri-stem],
	[cs-uri-query],
	[s-port],
	[cs-username],
	[c-ip],
	[cs(User-Agent)],
	[cs-host],
	[sc-status],
	[sc-substatus],
	[sc-win32-status],
	[time-taken]
FROM [dbo].[m_IIS_Log];

GO

Теперь вернемся к программе, которую я написал. Скачайте IIS2SQL и распакуйте в любой удобный каталог на сервере MSSQL. Если один сервер для MSSQL и IIS, то можно сразу запустить программу и поместить в планировщик заданий. А если нет, то вам надо будет каким то образом логи передать на сервер MSSQL. Напрямую с сервера IIS BULK сделать не получится. На сервере IIS создайте пользователя и расшарьте каталог с логами. А на сервере MSSQL напишем скрипт и поместим его выполнение в планировщик. Чтобы сервер сильно не нагружать, лучше настроить выполнение ночью.

Параметры для запуска IIS2SQL:

"C:\Program Files\IIS2SQL\IIS2SQL.exe" "ROOT_PATH" FILE_TYPE ADD_DAYS SERVER LOGIN PASSWORD DATABASE TABLE

Вот сам скрипт:

@echo off
net use Y: /delete /y
net use Y: \\192.168.1.1\IIS_Logs my_share_password /USER:logiis
"C:\Program Files\IIS2SQL\IIS2SQL.exe" Y: log -1 localhost dbuser dbpassword v2_prod_logs ViewIISLog
net use Y: /delete /y

Вот в принципе и все! Удачи!

Экстракт на все времена

tar-gzНазвание конечно шуточное, но намекающее на то, о чем хочу написать. А написать я хотел на тему распаковывания файлов разных форматов. В очередной раз пытаясь сначала вспомнить параметры для распаковки файла, а потом и прочтения help, я понял, что меня это достало. И надо что-то с этим делать.

Итак, создадим shell-скрипт и назовем его extract. В качестве аргумента он будет получать файл и в зависимости от формата выполнять распаковку.  Сам скрипт имеет вид:

#!/bin/sh
if [ -f $1 ] ; then
 case $1 in
  *.tar.bz2) tar xf $1 ;;
  *.tar.gz) tar xf $1 ;;
  *.bz2) bunzip2 $1 ;;
  *.rar) rar x $1 ;;
  *.gz) gunzip $1 ;;
  *.tar) tar xf $1 ;;
  *.tbz2) tar xf $1 ;;
  *.tgz) tar xf $1 ;;
  *.zip) unzip $1 ;;
  *.Z) uncompress $1 ;;
  *) echo "'$1' cannot be extracted via extract()" ;;
 esac
else
 echo "'$1' is not a valid file"
fi

Поместим его в /usr/bin и сделаем исполняемым для всех пользователей.

Блокируем клавиатуру в Linux

Изначально может показаться, что это очень странная задача, ведь можно просто заблокировать экран. Но если у вас в доме появился маленький ребенок, который то и дело норовит что то нажать, то поговорить, например, по Skype становится нереально. Итак, нужно максимально быстро заблокировать/разблокировать клавиатуру, чтобы маленький человечек не мог нажать/закрыть/удалить что-то во время общения по Skype с родственниками.

baby

Сначала Гугл меня навел меня на мысль использовать для этих целей xinput, но по какой то неведомомй причине моя клавиатура упорно не блокировалась. Дальнейшие поиски решения привели проекту Lock Keyboard for Baby. Проект не развивается уже с 2008, но у меня все заработало «с пол пинка». Итак, скачиваем скрипт и кладем его в папочку /usr/bin:

sudo mv lock-keyboard-for-baby-20080706.pl /usr/bin/lock
sudo chmod +x /usr/bin/lock

Откройте скрипт в любом удобном редакторе в первой строке поменяйте путь до вашего интерпретатора perl. Подсмотеть где он располагается можно используя команду

which perl

Далее в 7 строке (параметр defaultpassword) задайте пароль для разблокировки. После чего сохраните изменения и попробуйте его запустить. Если клавиатура заблокировалась, то все в порядке и блокировку можно вызывать по комбинации клавишь Alf+F2 и введя команду lock.

Под катом итоговый скрипт. Спасибо за внимание.

(далее…)

Обзор PAC Manager под Linux

В который раз я убеждаюсь в «силе» OpenSource. Не в той силе, что OpenSource-программы на много круче закрытых аналогов, а той, что позволяет при определенных знаниях и навыках закрыть баг самостоятельно. Помимо того , что вы получаете бесценный опыт в анализе чужого кода, вы еще и получаете моральное удовлетворение от проделанной работе. Главное не забывайте отправить багфикс автору. В конце заметки мы с вами самостоятельно исправим маленький баг в программе о которой пойдет речь.

В этот раз мне на глаза попался лучший, из всех что я видел, менеджер соединений под Linux. Для тех админов и программистов,у которых их больше трех, без удобного менеджера никуда. Для меня идеалом оказался PAC Manager. Я с легкостью настроил синхронизацию всех серверов через DropBox, да еще и подключил хранитель паролей KeePassX Manager.

По сути это просто продвинутая оболочка к таким типам подключений как:

  • SSH
  • RDP
  • MOSH
  • FTP
  • SFTP
  • SERIAL
  • VNC
  • WEBDAV

На столько продвинутая, что вы можете сами написать скрипты которые будут выполняться, например, перед подключением к серверу(например поднятие VPN-сессии).
pac

(далее…)

CrowdInspect 1.0.0.1

В раздел Загрузки добавил программу CrowdInspect.

CrowdInspect — это инструмент, призванный предупредить пользователя о наличии потенциальных вредоносных программ, которые поселились на компьютере и осуществляют взаимодействие по сети. Программа представляет собой host-based инструмент проверки процессов. Для обнаружения недоверенных или вредоносных сетевых процессов использует различные источники информации, включая такие сервисы, как VirusTotal, Web of Trust (WOT), Team Cymru’s Malware Hash Registry. Благодаря этим сервисам можно определять репутацию процесса, которая вычисляется из успешности/неуспешности пройденной проверки по каждому сервису и отображается в специальном поле цветом (зеленый/серый/красный) и репутации домена, с которым установлено соединение. Еще одной интересной возможностью инструмента является возможность записи истории взаимодействия с удаленным IP-адресом. И напоследок CrowdInspect способен определять thread injection, которую так любят вредоносные программы.

Windows_CrowdInspect

Как обнаружить спам-бота в своей сети

Не будем говорить о том, что надо ограничивать права, блокировать трафик и применять прочие методы для того чтобы в вашей сети не заводились спам-боты. Так как все равно каждый день появляются уязвимости, а с ними и новые вирусы.

Но вначале я бы хотел обратить ваше внимание на такой замечательный ресурс как http://mxtoolbox.com/blacklists.aspx, который периодически будет производить проверку вашего IP на наличие в black list. И в случае, если ваш IP будет замечен,- пришлет «тревожное письмо».

После этого возникнет вопрос какая машина заражена. Определить это очень просто. Просто приведу пример работы утилиты, которая должна быть на вооружении у каждого уважающего себя админа, а именно tcpdump. Естественно запускать tpcdump нужно на вашем шлюзе под управлением Linux

tcpdump -ni eth1 'tcp[tcpflags] & tcp-syn != 0 and dst port 25'

В моем примере eth1 — это интерфейс, который смотрит в локальную сеть.

Для шлюзов на основе Windows есть отличная тулза  Wireshark

AMILauncher for AsteriskAMILauncher for Asterisk

Customer ETickets Ltd.
State Ready
Description AMILaucher is a program that execute any external Windows application after call answer. AMILauncher uses AMI for connecting to Asterisk.
Demonstration Demo Video
Link Download

amilauncherЗаказчик ООО ETickets
Статус Готов
Назначение Написать программу-посредник под Windows, которая должна запускать внешнее приложение при поднятии трубки оператором. В качестве аргумента к внешней программе должен передаваться номер с которого пришел звонок (CallerID). Сервер IP-телефонии на основе Asterisk. Связь с сервером Asterisk происходит через AMI.
Демонстрация Видео
Ссылка Скачать проект

amilauncher