
- •По направлению 230100.62 – «Информатика и вычислительная техника» Профиль: «Вычислительные машины, комплексы, системы и сети»
- •Содержание
- •Введение
- •1. Обзор предметной области работы
- •1.1. Проблемы информационной безопасности картографических данных
- •1.2. Организация файлового хранилища на базе raid массива
- •1.3. Ограничение доступа к сети с применением proxy-сервера
- •2. Организация системы, описание реализации
- •2.1. Выбор конфигурации raid массива
- •2.2. Выбор Proxy сервера
- •2.3. Разработка структуры системы
- •2.4. Выбор инструментальных средств разработки
- •3. Реализация проекта
- •3.1. Организация raid 10
- •3.2. Установка и настройка ftp сервера
- •3.3. Конфигурирование Proxy-сервера
- •3.4. Разработка клиентского модуля
- •3.4.1. Работа с ftp сервером
- •3.4.2. Работа с консолью 7-Zip
- •3.4.2. Конфигурационный файл
- •3.4.3. Лог файл
- •Заключение
- •Конфигурационный файл Squid
- •Листинг клиентской программы
- •Конфигурационный файл клиентской программы
- •Акт о принятии к внедрению
Заключение
В результате выполнения работы были решены следующие задачи:
Разработана и реализована схема системы защиты картографических файлов на базе FTP сервера
Произведена установка файлового хранилища на базе RAID-массива уровня 10.
Разработан и реализован на языке C# клиентский модуль для доступа к серверу с функцией шифрования файлов с помощью алгоритма AES-256.
Закреплены навыки программирования и опробовано коллективное ведение проекта с помощью сервиса bitbucket.org.
Получен акт о принятии к внедрению (Приложение 4).
ЛИТЕРАТУРА
Бабенко Л.К., Басан А.С., Журкин И.Г., Макаревич О.Б. Защита данных геоинформационных систем: учеб. Пособие для студентов вузов / Под ред. И.Г. Журкина. – М.: Гелиос АРВ, 2010. – 336 c.
Скляров Д. В. С43 Искусство защиты и взлома информации. — СПб.: БХВ-Петербург, 2004. - 288 с.
RAID-массивы. Надежность и производительность. [электронный ресурс]. URL: http://rlab.ru/doc/raid_arrays.html
Кэширующий прокси-сервер. [электронный ресурс]. URL: http://www.habrahabr.kz/admin_287_sozdaem-keshiruyuschiy-proksi-server.html
Описание Squid прокси-сервера.[электронный ресурс]. URL: http://rukul.ru/squid-proxy-server
[электронный ресурс]. URL: http://filezilla.ru/
[электронный ресурс]. URL: http://7-zip.org.ua/ru/
Advanced Encryption Standard [электронный ресурс]. http://mind-control.wikia.com/wiki/Advanced_Encryption_Standard
"MSDN" - информационный сервис для разработчиков [электронный ресурс]. URL: http://msdn.microsoft.com/ru-ru/.
Документация BytesRoad.NetSuit Library 2.0.
SQUID 2.6.STABLE Configuration File [электронный ресурс]. URL: http://www.squid-cache.org/Versions/v2/2.6/cfgman/
ГОСТ 19.701-90 (ИСО 5807-85) ЕСПД. Схемы алгоритмов, программ, данных и систем. Обозначения условные и правила выполнения.
Программирование на C# [электронный ресурс]. URL: http://professorweb.ru/
ПРИЛОЖЕНИЕ 1
Конфигурационный файл Squid
#Рекомендуемый минимум:
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
acl my_network src 192.168.0.0/24
acl all src 0.0.0.0/24
http_access allow my_network
http_access deny all
cache_dir ufs /var/squid/cache 2048 16 256
maximum_object_size 10240
ПРИЛОЖЕНИЕ 2
Листинг клиентской программы
Client.cs
using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
using System.Threading;
using System.IO;
using System.Diagnostics;
using BytesRoad.Net.Ftp;
using BytesRoad.Net.Sockets;
namespace ProtectingFtpClient
{
class Client
{
public static event EventLog evLog;
// параметры клиента.
int TimeoutFTP = 30000; //Таймаут.
string FTP_SERVER = "localhost";
int FTP_PORT = 21;
string FTP_USER = "";
string FTP_PASSWORD = "";
string UploadTmp = "tmp/upload.tmp"; // временный файл загрузки на сервер
string DownloadTmp = "tmp/download.tmp"; // временный файл загрузки с сервера
string passKey = "password"; // ключ шифрования
string currentDirectory;
public void Perform()
{
// Открываем файлы лога и конфигурации
LogFile log = new LogFile("var/actions.log");
ConfigFile conf = new ConfigFile("etc/settings.conf");
// создаем FTP клиент
FtpClient client = new FtpClient();
conf.evLog += new EventLog(log.LogWrite);
evLog += new EventLog(log.LogWrite);
if (evLog != null) evLog("Старт");
try
{ // чтение параметров клиента из конфиг. файла
client.PassiveMode = Convert.ToBoolean(conf.GetParamValue("PassiveMode")); //Включаем пассивный режим.
TimeoutFTP = Convert.ToInt32(conf.GetParamValue("TimeoutFTP"));
FTP_SERVER = conf.GetParamValue("FTP_SERVER");
FTP_PORT = Convert.ToInt32(conf.GetParamValue("FTP_PORT"));
FTP_USER = conf.GetParamValue("FTP_USER");
FTP_PASSWORD = conf.GetParamValue("FTP_PASSWORD");
}
catch
{
if (evLog != null) evLog("не верные параметры клиента");
}
//Если используется прокси сервер задаем параметры прокси.
//Console.WriteLine(conf.GetParamValue("UsingProxy"));
if (Convert.ToBoolean(conf.GetParamValue("UsingProxy")))
{
try
{
FtpProxyInfo pinfo = new FtpProxyInfo(); //Это переменная параметров.
pinfo.Server = conf.GetParamValue("Server");
pinfo.Port = Convert.ToInt32(conf.GetParamValue("Port")); //Порт.
switch (conf.GetParamValue("Type")) //Тип прокси - всего 4 вида.
{
case "Socks4":
pinfo.Type = FtpProxyType.Socks4;
break;
case "Socks4a":
pinfo.Type = FtpProxyType.Socks4a;
break;
case "Socks5":
pinfo.Type = FtpProxyType.Socks5;
break;
default:
pinfo.Type = FtpProxyType.HttpConnect;
break;
}
if (pinfo.PreAuthenticate =
Convert.ToBoolean(conf.GetParamValue("PreAuthenticate")))
//Если на прокси есть идентификация
{
pinfo.User = conf.GetParamValue("User");
pinfo.Password = conf.GetParamValue("Password");
}
//Присваиваем параметры прокси клиенту.
client.ProxyInfo = pinfo;
}
catch
{
if (evLog != null) evLog("не верные параметры Proxy");
}
}
conf.Close();
//Подключаемся к FTP серверу.
// ----------------------------------------
if (client.IsConnected)
{
if (evLog != null) evLog("клиент подключен " + client.IsConnected);
}
else
{
if (evLog != null) evLog("клиент не подключен " + client.IsConnected);
}
// ----------------------------------------
if (evLog != null) evLog("Статус: подключение...");
Thread.Sleep(1000);
try
{ // подключение к серверу
client.Connect(TimeoutFTP, FTP_SERVER, FTP_PORT);
if (evLog != null) evLog("Статус: подключение выполнено");
if (evLog != null) evLog("Статус: аутентификация...");
Thread.Sleep(1000);
try
{ // аутенификация на сервере
client.Login(TimeoutFTP, FTP_USER, FTP_PASSWORD);
if (evLog != null) evLog("Статус: аутентификация пройдена");
}
catch
{
if (evLog != null) evLog("Статус: ошибка аутентификации");
}
}
catch
{
if (evLog != null) evLog("Статус: ошибка сервера");
}
if (client.IsConnected)
{
if (evLog != null) evLog("Статус: клиент подключен " + client.IsConnected);
}
else
{
if (evLog != null) evLog("Статус: клиент не подключен " + client.IsConnected);
}
// -----------------------------------------------------------------------------
currentDirectory = client.GetWorkingDirectory(TimeoutFTP);
List(client);
string strIn;
bool life = true; // признак выполнения программы
while (life)
{
strIn = Console.ReadLine();
string[] sPar = strIn.Split(' '); // разбор команды
if (evLog != null) evLog("команда: " + strIn);
switch (sPar[0])
{ // получение содержимого текущего каталога с FTP
case "LIST":
//Rein(client);
List(client);
break;
// изменение директории на указанную
case "CWD":
//Rein(client);
Cwd(client, sPar[1]);
break;
// удаление указанного файла с сервера
//case "DELEf":
// client.DeleteFile(TimeoutFTP, "файл");
// break;
// удаление указанной папки с сервера
//case "DELEd":
// client.DeleteDirectory(TimeoutFTP, "папка");
// break;
// прием указанного файла с сервера
case "RETR":
Retr(client, sPar[1], sPar[2]);
break;
// отправка указанного файла на сервер
case "STOR":
Stor(client, sPar[1], sPar[2]);
break;
// завершить работу
case "QUIT":
life = false;
break;
case "state":
Console.WriteLine(client.IsConnected);
break;
}
}
// -----------------------------------------------------------------------------
Console.WriteLine("отключение...");
Thread.Sleep(1000);
try
{
evLog(Convert.ToString(client.IsConnected));
client.Disconnect(TimeoutFTP);
if (client.IsConnected)
{
if (evLog != null) evLog("отключение не выполнено " + client.IsConnected);
}
else
{
if (evLog != null) evLog("отключение выполнено " + client.IsConnected);
}
}
catch
{
if (evLog != null) evLog("Нет подключения");
}
log.Close();
Console.ReadKey(true);
}
void List(FtpClient ftpClient)
{
Rein(ftpClient);
//UTF8Encoding encode = new UTF8Encoding();
Console.WriteLine(currentDirectory);
foreach (FtpItem item in ftpClient.GetDirectoryList(TimeoutFTP, currentDirectory))
{
Console.WriteLine("{0, -30} {1, -10} {2,15} {3,20}",
item.Name, item.ItemType, item.Size, item.Date);
}
}
void Cwd(FtpClient ftpClient, string directory)
{
Rein(ftpClient);
ftpClient.ChangeDirectory(TimeoutFTP, directory);
currentDirectory = ftpClient.GetWorkingDirectory(TimeoutFTP);
List(ftpClient);
}
void Retr(FtpClient ftpClient, string destPath, string path)
{
string exp = path[path.Length - 3].ToString() +
path[path.Length - 2].ToString() + path[path.Length - 1].ToString();
Rein(ftpClient);
if (exp == ".zs")
{
try
{
evLog("получение файла " + currentDirectory + "/" + path + " с сервера");
ftpClient.GetFile(TimeoutFTP, DownloadTmp, currentDirectory + "/" + path);
evLog("файл " + currentDirectory + "/" + path + " получен успешно");
}
catch (Exception e)
{
evLog("ошибка получения файла");
Console.WriteLine(e.ToString());
}
Decode(destPath);
List(ftpClient);
FileInfo file = new FileInfo(DownloadTmp);
file.Delete();
}
else
{
try
{
evLog("получение файла " + currentDirectory + "/" + path + " с сервера");
ftpClient.GetFile(TimeoutFTP, destPath, currentDirectory + "/" + path);
evLog("файл " + currentDirectory + "/" + path + " получен успешно");
List(ftpClient);
}
catch (Exception e)
{
evLog("ошибка получения файла");
Console.WriteLine(e.ToString());
}
}
}
void Stor(FtpClient ftpClient, string path, string srcPath)
{
srcPath = Encode(srcPath);
Rein(ftpClient);
try
{
evLog("Статус: передача файла " + srcPath + " на сервер");
ftpClient.PutFile(TimeoutFTP, currentDirectory + "/" + path + ".zs", srcPath);
evLog("Статус: файл " + srcPath + " передан успешно");
List(ftpClient);
FileInfo file = new FileInfo(UploadTmp);
file.Delete();
}
catch (Exception e)
{
evLog("Статус: ошибка передачи файла");
Console.WriteLine(e.ToString());
}
}
void Rein(FtpClient ftpClient)
{ // реинициализация подключения
ftpClient.Connect(TimeoutFTP, FTP_SERVER, FTP_PORT);
ftpClient.Login(TimeoutFTP, FTP_USER, FTP_PASSWORD);
ftpClient.ChangeDirectory(TimeoutFTP, currentDirectory);
currentDirectory = ftpClient.GetWorkingDirectory(TimeoutFTP);
}
string Encode(string srcPath)
{
string _7zPath = "C://Program Files/7-Zip/7z.exe"; //путь к 7z.exe
string InPath = srcPath; //путь к исходному файлу
string OutPath = UploadTmp; //путь к результату
string ArgsCMD = "a -mx0 -p" + passKey + " " + OutPath + " " + InPath; // строка аргументов
using (Process pr = new Process())
{
evLog("Статус: шифрование файла...");
pr.StartInfo.FileName = _7zPath;
pr.StartInfo.Arguments = ArgsCMD;
pr.StartInfo.UseShellExecute = false;
pr.Start();
pr.WaitForExit();
evLog("Статус: шифрование завершено...");
return OutPath;
}
}
string Decode(string destPath)
{
string _7zPath = "C://Program Files/7-Zip/7z.exe"; //путь к 7z.exe
string InPath = DownloadTmp; //путь к исходному файлу
string OutPath = destPath; //путь к результату
string ArgsCMD = "x -p" + passKey + " " + InPath + " -o" + destPath; // строка аргументов
using (Process pr = new Process())
{
evLog("Статус: расшифровка файла...");
pr.StartInfo.FileName = _7zPath;
pr.StartInfo.Arguments = ArgsCMD;
pr.StartInfo.UseShellExecute = false;
pr.Start();
pr.WaitForExit();
evLog("Статус: файл расшифрован...");
return OutPath;
}
}
static void Main(string[] args)
{
Client cl = new Client();
cl.Perform();
}
}
}
ConfigFile.cs
using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
using System.IO;
namespace ProtectingFtpClient
{
class ConfigFile
{
string fileName;
FileStream fStream;
StreamReader sReader;
public event EventLog evLog;
public ConfigFile(string FileName)
{
this.fileName = FileName;
this.Open();
}
/*
~ConfigFile()
{
this.Close();
}
*/
public void Open()
{
if (sReader == null)
{
try
{
if (fStream == null)
fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
sReader = new StreamReader(fStream);
}
catch (Exception e)
{
//Console.WriteLine(e.ToString());
Console.WriteLine("Конфигурационный файл не найден");
if (evLog != null) evLog("Конфигурационный файл не найден");
}
}
else sReader.BaseStream.Seek(0, SeekOrigin.Begin);
}
public void Close()
{
if (sReader != null) sReader.Close();
if (fStream != null) fStream.Close();
}
public string GetParamValue(string ParName)
{
this.Open();
string parValue;
string str;
try
{
while ((str = sReader.ReadLine()) != null)
{
if (str.Length != 0 && str[0] != '#')
if (str.Length >= ParName.Length)
if (String.Compare(str, 0, ParName, 0, ParName.Length) == 0)
{
int i;
for (i = ParName.Length; i < str.Length && str[i] != '='; i++) ;
i++;
for (; i < str.Length && str[i] == ' '; i++) ;
int i0 = i;
for (; i < str.Length && str[i] != ' ' && str[i] != '\n' &&
str[i] != '\t' && str[i] != '\0' &&
str[i] != '#'; i++) ;
if (i > i0) parValue = str.Substring(i0, i - i0);
else parValue = "UndefinedValue";
return parValue;
}
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
parValue = "UndefinedValue";
return parValue;
}
}
}
LogFile.cs
using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
using System.Threading;
using System.IO;
namespace ProtectingFtpClient
{
delegate void EventLog(string str); // делегат события лога
class LogFile
{
string fileName;
FileStream fStream;
StreamWriter sWriter;
//public event EventLog evLog;
public LogFile(string FileName)
{
this.fileName = FileName;
this.Open();
}
/*
~LogFile()
{
this.Close();
}
*/
public void Open()
{
if (sWriter == null)
{
try
{
if (fStream == null)
fStream = new FileStream(fileName, FileMode.Append,
FileAccess.Write, FileShare.Read);
sWriter = new StreamWriter(fStream);
}
catch (Exception e)
{
//Console.WriteLine(e.ToString());
Console.WriteLine("Log файл не открыт");
}
}
else sWriter.BaseStream.Seek(0, SeekOrigin.End);
}
public void Close()
{
if (sWriter != null) sWriter.Close();
if (fStream != null) fStream.Close();
}
public void LogWrite(string str)
{
this.Open();
Console.WriteLine("[{0}]: {1}", DateTime.Now, str);
sWriter.WriteLine("[{0}]: {1}", DateTime.Now, str);
sWriter.Flush();
//Console.ReadKey();
}
}
}
ПРИЛОЖЕНИЕ 3