Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пример пояснительной записки.doc
Скачиваний:
14
Добавлен:
23.05.2015
Размер:
596.99 Кб
Скачать

Заключение

В результате выполнения работы были решены следующие задачи:

  1. Разработана и реализована схема системы защиты картографических файлов на базе FTP сервера

  2. Произведена установка файлового хранилища на базе RAID-массива уровня 10.

  3. Разработан и реализован на языке C# клиентский модуль для доступа к серверу с функцией шифрования файлов с помощью алгоритма AES-256.

  4. Закреплены навыки программирования и опробовано коллективное ведение проекта с помощью сервиса bitbucket.org.

  5. Получен акт о принятии к внедрению (Приложение 4).

ЛИТЕРАТУРА

  1. Бабенко Л.К., Басан А.С., Журкин И.Г., Макаревич О.Б. Защита данных геоинформационных систем: учеб. Пособие для студентов вузов / Под ред. И.Г. Журкина. – М.: Гелиос АРВ, 2010. – 336 c.

  2. Скляров Д. В. С43 Искусство защиты и взлома информации. — СПб.: БХВ-Петербург, 2004. - 288 с.

  3. RAID-массивы. Надежность и производительность. [электронный ресурс]. URL: http://rlab.ru/doc/raid_arrays.html

  4. Кэширующий прокси-сервер. [электронный ресурс]. URL: http://www.habrahabr.kz/admin_287_sozdaem-keshiruyuschiy-proksi-server.html

  5. Описание Squid прокси-сервера.[электронный ресурс]. URL: http://rukul.ru/squid-proxy-server

  6. [электронный ресурс]. URL: http://filezilla.ru/

  7. [электронный ресурс]. URL: http://7-zip.org.ua/ru/

  8. Advanced Encryption Standard [электронный ресурс]. http://mind-control.wikia.com/wiki/Advanced_Encryption_Standard

  9. "MSDN" - информационный сервис для разработчиков [электронный ресурс]. URL: http://msdn.microsoft.com/ru-ru/.

  10. Документация BytesRoad.NetSuit Library 2.0.

  11. SQUID 2.6.STABLE Configuration File [электронный ресурс]. URL: http://www.squid-cache.org/Versions/v2/2.6/cfgman/

  12. ГОСТ 19.701-90 (ИСО 5807-85) ЕСПД. Схемы алгоритмов, программ, данных и систем. Обозначения условные и правила выполнения.

  13. Программирование на 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