יום שני, 13 ביולי 2015

MySql Proxy



מסדי נתונים חשופים להמון סוגים של התקפות וזליגת מידע, דרך לטפל בבעיה היא בעזרת Proxy שיושב בין מי שמבקש ולמסד עצמו ומאפשר לנתח את הבקשות והתשובות לפני שהן חוזרות בחזרה ללקוח, נניח שמשהו הצליח לבצע הזרקה של קוד זדוני שמחזיר את כל כרטיסי האשראי בטבלה, הפרוקסי יכול לתפוס את הבקשה ולהפיל אותה, או לעשות מיסוך על כרטיסי האשראי בצורה שלא יהיה ניתן לעשות איתם שימוש.

דרישות:

שימו לב!
  • המאמר נכתב על Windows 7 64 Bit
לפני שנתחיל לצלול פנימה יש להוריד את ולפרוס את קבצי MySql Proxy באיזה מקום שתרצו על השרת, לאחר מכן יש להוריד ולהתקין את Lua, שפת סקריפטים מאוד מהירה, היא פופלרית בעיקר ב Embedded ומשחקי מחשב, היה בה שימוש רחב ב World Of Warcraft.

לצורך הדוגמה ניצור טבלה שתכיל מספרי אשראי ונעמיס עליה נתונים,נבצע שאילתה פשוטה:

בקשה ישירה למסד הנתונים

התוצאות מכילות כרטיסי אשראי שניתן לראות אותם בבירור בתשובה שחוזרת, כמובן שהדרך המסורתית היא להצפין את המידע אבל הכלים שה Proxy נותן מאפשרים לך שליטה על כל נקודה מרגע ההתממשקות עד להחזרת התוצאות ללקוח כפי שנראה בהמשך.

Proxy

פעולת ה Proxy היא ברורה מאוד וכבר הספקתי לכתוב עליה בעבר, אבל במבט מהיר אפשר לראות שהמשתמשים לא באמת מגיעים למסד נתונים אלא לתחנת בניים שתחליט מה לעשות עם הבקשה והתשובה שחוזרת, בשונה מ Proxy "רגיל" שמעביר דרכו בקשות ומשנה אותם באופן בסיסי, ה MySql Proxy מאפשר לנתח את הפרוטוקול ולשנות אותו באופן פשוט למדי.


על מנת להפעיל את ה Proxy יש לכתוב את הפקודה הבאה:

C:\mySqlProxy\bin>mysql-proxy.exe --proxy-backend-addresses=127.0.0.1:3306 --proxy-address=127.0.0.1:4040 --proxy-lua-script=all-hooks.lua

הפקודה מחברת את שרת ה Proxy למסד הנתונים ובנוסף מוסיפים קריאה לקובץ סקריפט של Lua, מאותו רגע כל בקשה שתגיע לפורט 4040 תפעיל מספר פונקציות ונוכל לדוג אותן, לדוגמה ברגע שיבצעו שיאלתא, הפונקציה read_query תרוץ ונוכל להחליט אם להעביר את השאילתא או לא ובמקרה של תשובה מהשרת הפונקציה read_query_result תרוץ ובה נוכל לשנות את המידע שחוזר.

Hooks


-- all-hooks.lua
local access_ndx = 0

-- fired when client connect to server
function connect_server()
    print_access ('inside connect_server')
end

-- fired when starting the handshake
function read_handshake( auth )
    print_access ('inside read_handshake' )
end

-- fired when starting the authentication
function read_auth( auth )
    print_access ('inside read_auth ')
end

--fired when authentication finished
function read_auth_result( auth )
    print_access ('inside read_auth_result')
end

--fired when client disconnected
function disconnect_client()
    print_access('inside disconnect_client')
end

--fired when query requested
function read_query (packet)
proxy.queries:append(1, packet,{ resultset_is_needed = true })
return proxy.PROXY_SEND_QUERY
end

--fired when query result
function read_query_result (inj)

--create result set containes columns and rows
proxy.response.resultset = {fields = {}, rows = {}}

--checking if the query holding creditcard table name
if(string.match(inj.query,"creditcard")) then

for n = 1, #inj.resultset.fields do
-- insert column to table
table.insert(proxy.response.resultset.fields, {type
             =inj.resultset.fields[n].type,name = inj.resultset.fields[n].name})
end


for row in inj.resultset.rows do
if(row ~= nil) then
 for i,v in pairs(row) do
--looking for creditcard pattern
if string.match(v,'%d%d%d%d%-%d%d%d%d%
                                                                 -%d%d%d%d%-%d%d%d%d') then
print_access("found visa - column position: " .. i 
                                                                      .. " column value: " .. v)
row[i] = "mask credit card"
end
 end
table.insert(proxy.response.resultset.rows, row)
end
end

--overwrite results
proxy.response.type = proxy.MYSQLD_PACKET_OK
return proxy.PROXY_SEND_RESULT
end
end

-- simple print message
function print_access(msg)
    access_ndx = access_ndx + 1
    print( string.format('%3d %-30s',access_ndx,msg))
end



מייצרים טבלה ריקה, עוברים על הטבלה שחזרה מהמסד נתונים ושופכים אותה לטבלה שיצרנו, לפני שמכניסים שורה חדשה מחפשים אם יש ערך שתואם למבנה כרטיס אשראי ודורסים אותו.

התוצאות שחוזרות מה Proxy


סיכום

ראינו רק דרך פעולה אחת עם ה Proxy ש MySql  אבל אפשר להשתמש בו בתחומים נוספים כמו ניהול עומסים, שרידות ובקרה, בעזרתו ניתן להגדיל את הזמינות ואמינות המידע ולהדק את חגורת האבטחה סביב המידע שרגיש לכולנו.

לא תשתמש בו?

אין תגובות:

הוסף רשומת תגובה