From 3974019fba5df69e0115cd552b3c8388787fc0f1 Mon Sep 17 00:00:00 2001 From: sjaved02 <44710360+sjaved02@users.noreply.github.com> Date: Wed, 7 Nov 2018 19:50:39 -0500 Subject: [PATCH 1/2] Add files via upload --- ...a Instructions - Ubuntu 18.04.1 Server.txt | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 Pythia Instructions - Ubuntu 18.04.1 Server.txt diff --git a/Pythia Instructions - Ubuntu 18.04.1 Server.txt b/Pythia Instructions - Ubuntu 18.04.1 Server.txt new file mode 100644 index 0000000..5396a22 --- /dev/null +++ b/Pythia Instructions - Ubuntu 18.04.1 Server.txt @@ -0,0 +1,125 @@ +1. Start with fresh install of Ubuntu Server 18.04.1 LTS + +2. ** instructions to uninstall Python 3.6 + +3. ** instructions to install Python 2 + +4. ** Instructions to install Mongodb + +5. ** Install Instructions for django for Python 2 + +5. ** Instructions to install Ngnix + +6. Fork the latest Pythia source from GitHub + +7. Transfer the source code to dir on Ubuntu ## Recommend to use system wide available location like /opt + +8. Install Python pip + a. Update the apt sources list by opening /etc/apt/sources.list file and adding 'universe' at the end of each line. Your sources list sould look like this: + deb http://archive.ubuntu.com/ubuntu bionic main universe + deb http://archive.ubuntu.com/ubuntu bionic-security main universe + deb http://archive.ubuntu.com/ubuntu bionic-updates main universe + b. run apt update as a root + -> sudo apt update + c. Install Python pip + -> sudo apt install python-pip + +9. Run Python server to make sure everything is configured correctly and we can create django app + a. Update the /opt/pythia/django/cryptoService/urls.py file ** Note: this is assuming that you transferred pythia folder to /opt and did not download the latest commit from BitHub + b. Your /opt/pythia/django/cryptoService/urls.py should look like this after taking out entry from patterns: + """ + URLs configured for our remote cryptographic services. + """ + from django.conf.urls import include, url + from django.contrib import admin + + urlpatterns = [ + url(r'^pythia/', include('pythiaPrfService.urls')), + ] + c. run the Python server + -> python manage.py runserver ** Note: Run this command from /opt/pythia/django folder, once again, assuming you are working of /opt directory + d. you should see output similar to this: + **** Insert Picture of Terminal ***** + Django version 1.11.16, using settings 'cryptoService.settings' + Starting development server at http://127.0.0.1:8000/ + Quit the server with CONTROL-C. + **** Insert Picture from the Browser *** + +10. Configure the crpto service so that it allowed connections from our machine + a. Edit the /opt/pythia/django/cryptoService/settings.py and add followin line + -> ALLOWED_HOSTS=[''] + +11. Configure uwsgi ****WORK ON MAKING IT PART OF SYSTEMD Servive, so it starts at system start up **** + a. Edit Paths in /opt/pythia/config/django-uwsgi.ini + set chdir to /opt/pythia/django + set socket to /opt/pythia/django/app-server.sock + b. Create a socket + -> mkfifo /opt/pythia/django/app-server.sock + c. Start the uwsgi service + -> uwsgi --ini /opt/pythia/config/django-uwsgi.ini + *** Add screen shot of spanned processes *** + +12. Configure nginx and point it to uwsgi instance created in step 10. + a. Edit /opt/pythia/config/nginx.conf and make sure all paths are correct. ** Basically you want to make sure they relate to your environment ** + b. Edit /opt/pythia/config/django-nginx.conf. This is where we point nginx to our socket created in step 10. So that it is used by django + set server to unix:///opt/pythia/django/app-server.sock + +13. Configure the nginx. Edit /opt/pythia/config/django-nginx.conf file + a. Set server_name to the ip address of your server. ***Note: This needs to be done for two server_name entries*** + b. Generate self signed certificates: + -> /usr/bin/openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes + c. Move the cert.pem to /etc/ssl/certs dir + -> sudo mv cert.pem /etc/ssl/certs/ + d. Move the key.pem to /etc/ssl/private dir + -> sudo mv cert.pem /etc/ssl/private/ + e. Edit /opt/pythia/config/django-nginx.conf file once again and set the following values for ssl + ssl_certificate /etc/ssl/certs/cert.pem; + ssl_certificate_key /etc/ssl/private/key.pem; + +14. Configure the nginx so that it is run with our nginx configuration file + a. Make a backup of original nginx configuration file + -> cd /etc/nginx + -> sudo mv nginx.conf nginx.conf.orig + b. Create a link from our nginx.conf file + -> sudo ln -s /opt/pythia/config/nginx.conf nginx.conf + c. Remove the default from nginx + -> sudo rm /etc/nginx/default + d. Finally add our django app + -> ln -s /opt/pythia/config/django-nginx.conf django.conf + e. And ask nginx to reload our configuration + -> nginx -s reload + d. If and only if nginx was not running at point e above, start it + -> service nginx start + +15. Configure the nginx to display our static page as default page. The pythia comes with simple default page that you use + a. Create a root diretory for our web server + -> sudo mkdir /wwwrooot + -> ln -s /opt/pythia/static-html/ /www/static + b. (Optional) Open the default html page, /www/static/index.html, and fix the link pointing to romote-crypto eval location to the IP address of your server. + +16. Open your browser and point it to the IP address of your server. + + ****Add Image of default Page**** + +17. Click on Remote Crypto-crypto.pythia.eval link and if you did not fix the link location in step 15 b above, fix the url in address bar of browser and point to the ip address of your server !!! + + + + + + + + + + + + + + + + + + + + + From 72b8b6a9cb301eaf80d6033ae61b0b54b57f0453 Mon Sep 17 00:00:00 2001 From: sjaved02 <44710360+sjaved02@users.noreply.github.com> Date: Wed, 7 Nov 2018 20:39:42 -0500 Subject: [PATCH 2/2] pythia original source code updated Pythia was updated and configured for ubuntu 18.04.1 server. Python2+django+nginx+mongodb. --- config/django-nginx.conf | 10 +++++----- config/django-uwsgi.ini | 4 ++-- django/cryptoService/__init__.pyc | Bin 0 -> 131 bytes django/cryptoService/settings.py | 1 + django/cryptoService/settings.pyc | Bin 0 -> 557 bytes django/cryptoService/urls.py | 6 +++--- django/cryptoService/urls.pyc | Bin 0 -> 429 bytes django/cryptoService/wsgi.pyc | Bin 0 -> 597 bytes django/pythiaPrfService/crypto.pyc | Bin 0 -> 2043 bytes django/pythiaPrfService/datastore.pyc | Bin 0 -> 4605 bytes django/pythiaPrfService/response.pyc | Bin 0 -> 2134 bytes django/pythiaPrfService/settings.pyc | Bin 0 -> 1525 bytes django/pythiaPrfService/urls.pyc | Bin 0 -> 779 bytes django/pythiaPrfService/views.pyc | Bin 0 -> 5499 bytes 14 files changed, 11 insertions(+), 10 deletions(-) create mode 100644 django/cryptoService/__init__.pyc create mode 100644 django/cryptoService/settings.pyc create mode 100644 django/cryptoService/urls.pyc create mode 100644 django/cryptoService/wsgi.pyc create mode 100644 django/pythiaPrfService/crypto.pyc create mode 100644 django/pythiaPrfService/datastore.pyc create mode 100644 django/pythiaPrfService/response.pyc create mode 100644 django/pythiaPrfService/settings.pyc create mode 100644 django/pythiaPrfService/urls.pyc create mode 100644 django/pythiaPrfService/views.pyc diff --git a/config/django-nginx.conf b/config/django-nginx.conf index 37b9349..b7d907a 100644 --- a/config/django-nginx.conf +++ b/config/django-nginx.conf @@ -1,7 +1,7 @@ # upstream app-server upstream django { - server unix:///home/ubuntu/pythia-server/django/app-server.sock; + server unix://opt/pythia/django/app-server.sock; } # Convert HTTP requests into HTTPS requests @@ -9,14 +9,14 @@ server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; - server_name 52.53.223.245 localhost; + server_name 192.168.200.71 localhost; rewrite ^ https://$server_name$request_uri? permanent; } server { listen 443 default_server ssl; - server_name 52.53.223.245 localhost; + server_name 192.168.200.71 localhost; # listen 80 default_server; # ssl on; @@ -31,8 +31,8 @@ server ssl_session_cache shared:SSL:1m; ssl_session_timeout 1m; - ssl_certificate /etc/ssl/certs/unified.remote-crypto.io.crt; - ssl_certificate_key /etc/ssl/private/remote-crypto.io.key; + ssl_certificate /etc/ssl/certs/cert.pem; + ssl_certificate_key /etc/ssl/private/key.pem; charset utf-8; client_max_body_size 250K; diff --git a/config/django-uwsgi.ini b/config/django-uwsgi.ini index 79b66f1..609d417 100644 --- a/config/django-uwsgi.ini +++ b/config/django-uwsgi.ini @@ -1,7 +1,7 @@ [uwsgi] # the base directory (full path) -chdir = /home/ubuntu/pythia-server/django +chdir = /opt/pythia/django # Django's wsgi file as python module # e.g. crypo.wsgi maps to the file: DIR/crypto/wsgi.py where DIR is the chdir above @@ -13,7 +13,7 @@ master = true processes = 10 # the socket (use the full path to be safe). uWSGI will create this when it starts. -socket = /home/ubuntu/pythia-server/django/app-server.sock +socket = /opt/pythia/django/app-server.sock # permissions chmod-socket = 666 diff --git a/django/cryptoService/__init__.pyc b/django/cryptoService/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52c18f48ef36892c627d0e897ce9fc9f319b5c05 GIT binary patch literal 131 zcmZSn%*(ao?A_>O1}IE{=e=oeI$WMn4l zr(`AOrRVD>7gZLNc_`t=4F<|$Lj$VaR4>gSx5NW_vh#J7^kYZR9m6uABY7 zJ{*j@r6>U&=vGj+CmRTqG9FVZTWAw!6gVOM=KPQD>h$Y;jr2U|2us49zg(9hy+9gJ%J&DDuRJRMS=J%g?r+|H-twg)zq= z`xs;ezPc8g*R|VXuXu09PUl`@Xe%)XW!P}>uk4I^D}$sn%p>E}I48|$Ge7YMAujaf jidE9Gp;&HR6%}4ljtyS>&7j5H%Uge*O%M`tMYi-8>c(iz literal 0 HcmV?d00001 diff --git a/django/cryptoService/wsgi.pyc b/django/cryptoService/wsgi.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9968ee72b08585c3089700c8333b0e816a2285d0 GIT binary patch literal 597 zcmY*W!H&}~5OvaRK>?(dK%9N-0b+4NLI?rcr7D6hB8!m9AvN|Sb>-MrJlmz`{V9He zA3)+O_y8CufELSs8T)zO%yT9`?-XCZ{rIHVpE05Db6W8wfo5z?m@%C*o3VAqAY;3n z?IujqJYrWl%Mv|h_K0;;ww|&KrtFIHW+|zf&yv=6g5qPfSaRiEV_M$$p6i`-t$)`y zk%!*zKw()FOXTn+_z02X7WkMWt(BiGa2dJeo!1u@9$MIg<$KwifpW3~%{Lnvf;CE_ z@ouvry;oGI^F46msAe}1+&dCCkvGP|10Dg2EnlSe|-;*OS*8AEW3l?tU87i)G-3eEl?Gyup(C!Wr=JDufL#pT7) z6=|uL(=1k#Dvw=OV1AyR8#UE-n&s(UnEiv#X~)B>?jB54&aIx9(fHtr$>Sn1nc_$9 z!kl$`qgOwk^n}?Ld$Tk}&wT%I1kx zS|yoKs>=(t(90$GRJ`l1D|XM#h20B-n_PKq)WViGQ@kc(IJe3*M1V0PI@9C1d4Rh* zXaABs+ukSzVkrlEbe~edd#EtO=MkX@v@M>ioVfVZtD)AfQ8CrdGLW zSybs1SEJ&pEKTl2RZ7p(qRiZMp*n+p_wiQ;J4)w?Dvhg3yv^&wpft9cJEfV%&iB#D zE{kqQjkPrgPn30~h%-Qah+-DRbs`qN{TK$|U*8kp@Fj^Kyf;3MaKkA2CaM# za#*b;z{J_FVZxw?tV`_-SB_5+lcUo6&wR-LuJYtYG#DkkbMSK|xN z$)^SH81YdqWc_ypV^^ZW3Kvx!@#dt=Z literal 0 HcmV?d00001 diff --git a/django/pythiaPrfService/datastore.pyc b/django/pythiaPrfService/datastore.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7548176adebd7ce23f4884d06df93c0b6514b076 GIT binary patch literal 4605 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 E0C%Ch^8f$< literal 0 HcmV?d00001 diff --git a/django/pythiaPrfService/views.pyc b/django/pythiaPrfService/views.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea15b3e99148c185e83474170a6b8e6819fc8db6 GIT binary patch literal 5499 zcmb_g-EtdA6+W$zWJ#7|$IfPx&F*HlNHzi-yJ{)SLQ$!NSi1xh$2$_i@rD%>P0Joj zno*`(RxhP$~*C)KOHQNSUeRq>@9OEOoQAmnFqxved~@H&1(c z>dw*L9CZt{S3qBmUSY~21$hxl6wHY*PeDP1G6h8u7APo*aDjq(5f&*Zi?Bq&f(REW zxFEtZ1&boAP_QJzCDLzEaFJdq+Ph2v+LuMX!g8&0iQn)e6s4L@j&$ON-Cjp`b!2@T z#*rJhTzjD1ouNGleRs$E#5EWfHuYL5{11LA3c8ky@1$Y@V&GeC!>+D4+?hpj)Qfu) zA!%7|e%3KfR^x~3_wkqo6qaZtQ@+e#f84!YVOxm0KJq&r*V4u2ASL>FUmIJ2NK%+p zNb6W{y(ha~4-WlkKc3Wfk`})y-eCPG)C04ILA>W5cl_?Nz`rvO+2EmXwmUBe6^~y; zcIM?-!gIf-6PVi~f5?r5ve*-R^^+mKg;-Z`5|=nm6t89NI5ywKnu zA*2x|aA@D5afTxaV#a=k#tsc{PDpZ;p^-x`9eSFhahAp?^E95Lae;mry-iv0a=S#y z6H?JcgEA@jE7Vn|`OG0~vI?A3gi_s_RE-^(P&(CK?iW22xrnUr3ZN?J%%x zG6=n16349y*Q9A*+Z{jgyT-E1PC`NTMN{`U-dQF(og{JMY14}%qeUr-t^Ta9lcDri zU+aGd8dcAGSp7!UsSy(jh{bw_@HhtPrL6w+N{3T#r*y=6GzjfB%Jl5 zD$b$8fDn?DXo*viD8)w{COVJ`LL9b?fLP+OqQFyn{0`m)6mldQmL*D00m5km5>Ijk zk6{<0+@dNwPUdE2Q5Bpyr>qv7CXe8y86pDXe?mYgKST+XDuyn01YofYV4({DMvK6B zg2x;^1>lci9HI-u07PID`IMp!WMJ@$4Imo$Oum+WOa?Rqv~w~rD|3`+JWt~?G4Ase zVx4p*fLSuL4g6E1d6}auWjb)Wni3DS)Q-gVY> zx%dFZSrVzYq0hE4?5DsjuzJH;QKej7eW2b$Ew5J8J5G~#!rsFu7WDoZ!tnZpX;U@^ z{emE$f`o;KXF2v`a4d3uKvFoC!HmIzbCy&5gGn>YwP4j2Kn}3NBLv%A70x{bl+j)| zUZ_Z*YW4!fAO_qRyMX_sKE*Pi4r2n%=&x1yCCsl;2*&QY%}$7n9*he9P19x9#^7Xx zd+RrT)4qMDeQWFv4s@d3Hq&*Wlkf=S+e+fDI}qZPsoJ+DO}A147W<0%20IBdeu0C` zDvdp9tVq7a$(qNU>oKCdZ*g%0g-{uAx5<0)ZgMkoW<{usxx_mG(kfT4alw#~B}}?5 zFA*oa`%h2s@7zl5)=Uu5VxB1#sS z)%T~F)#s#?0*M_u9GW;xNpPF^JzQC`rr#-w6z#(IlRvNt;mEv528&!fS>#aY07)KT z!i&XhYK0gBAiN?DiL8``(y}Ol4TM#A>{q-oWGX2>zz=P#^*62pK38kDH0h~f`biG= zF(QH(+tW4)^$`FR`CZ_n$Jr6gnV8hoIRyQ*Uf(%pj^h;b_)Z{`@!)it z<4k3CKF;6n9%n7DDGMG&QKp%WIoZrwDc!9f3fA2>GdDMEfu@GCOWE6rs_TQ+x}o8; zGzB(NRohP@^CMYzb|h!2whuhRm827a748D}ISKqQ zx%UGMkV*$ZhkaZQR1yyHcJC_MJdVd6zpYFmHZUo-{}7F5I09jx-(n8KfrCm80{()! zqL!Sz`p7BfuRF`CklC*AE+heJG=jLY5qHs+{kqH+9jP ztwMoGFYU$H^t%)%LGsl@%<&1XS3132v#I2~PR?7TQ+`A1#zDWM?=ZER4^iY*Nq(2q UyG~KzH#1W@#cM^k_