SlideShare a Scribd company logo
1 of 26
Title of slide to go here 
RelateIQ @ MongoSF
RelateIQ @ MongoSF 
Blog 
blog.relateiq.com 
RelateIQ Twitter 
@relateiq 
{ 
name: “Jón Tómas Grétarsson”, 
pretty_description: “Early Engineer”, 
email: “jon@relateiq.com”, 
twitter: @jontomas 
}
1. MongoDB at RelateIQ 
2. Encryption at Rest 
3. Golden Horde (Oplog) 
4.Q&A 
Agenda
MongoDB usage at RelateIQ 
Our stack 
● Multiple consumers 
● Distributed services 
● Batch and stream processing 
We speak JSON 
● Cross-language compatibility 
● Engineer-debuggable 
● Easy to test! 
MongoDB 
● Strong Java support via morphia 
o Lifecycle methods!
Lifecycle methods 
Golden Horde
At-Rest Encryption 
@preLoad 
Called before mapping the datastore object to the 
entity (POJO); the DBObject is passed as an 
argument (you can add/remove/change values) 
You have 
● The DBObject 
● A class definition (reflection!) 
You don’t have 
● That POJO with all the 
convenience methods 
@preSave 
Called right before DBCollection.save() is called. 
Changes made to the entity (POJO) will not be 
persisted; the DBObject can be passed as an 
argument (you can add/remove/change values) 
You have 
● The original POJO, including class 
definitions and convenience 
methods
At-Rest Encryption 
SadPojo.java 
public class SadPojo { 
public String clientId; 
public String secret; 
}; 
SadDAO.java 
public class SadDAO 
extends BasicDAO<SadPojo> { 
@Inject 
public SadDAO(Datastore ds) { 
super(SadPojo.class, ds); 
} 
};
At-Rest Encryption 
Command Line 
> db.SadPojo.findOne() 
{ 
"_id": ObjectId("5445dd2b7830e8d4dff439d9"), 
"clientId": "Dr. No", 
"secret": "What follows are my evil plans to take over the 
world..." 
}
SketchyPojo.java 
public class SketchyPojo { 
public String clientId; 
public String secretKey; 
public String secret; 
@PreSave 
public void preSave(DBObject obj) { 
obj.put(“secret”, encryptWithSecret(secretKey, secret); 
} 
@PreLoad 
public void preLoad(DBObject obj) { 
try { 
obj.put(“secret”, decryptWithSecret(obj.get(“secretKey”), obj.get(“secret”)); 
} catch (EncryptionException e) {} 
} 
}; 
At-Rest Encryption (Take One)
At-Rest Encryption (Take One) 
Command Line 
> db.SketchyPojo.findOne() 
{ 
"_id": ObjectId("5445dd2b7830e8d4dff439d9"), 
"clientId": "Dr. No", 
"secretKey": "<BASE64-encoded byte string>", 
"secret": "APu5vPONiaLD4- 
ykkgG6gG7hlN7reB_XY3rqLGkQ5aBTZBXveUqH_jJwRSjNCMCjrT0rFSe0ZCyrUAxPvjzV 
idKs5JIbtvwX0SQqGmKf_853a-L_CkoyCRgJfPwzf81XM1dpGR8Kp9hMNAvkrdbco- 
GdZgE6HENRnXcLzmoYTVhUIhwSCi3rX_8w9_Wn_GVLGI3EF-s- 
0r7bqElxn0CB2l4W80sjDTlom_0nbZfwF92Xq9cctnnWghgLYaVEWxL3Va2tQL-BJtybcMiJd- 
DnxXjHxlRPRB4jtIP8eJMagW7hCh7aDEOC5s0SEiZs5fLRt-dExKgbwxjz" 
}
SketchyPojo.java 
public class SketchyPojo { 
public String clientId; 
public String secretKey; 
public String secret; 
@PreSave 
public void preSave(DBObject obj) { 
obj.put(“secret”, encryptWithSecret(secretKey, secret); 
} 
@PreLoad 
public void preLoad(DBObject obj) { 
try { 
obj.put(“secret”, decryptWithSecret(obj.get(“secretKey”), obj.get(“secret”)); 
} catch (EncryptionException e) {} 
} 
}; 
At-Rest Encryption (Take One)
At-Rest Encryption (Take Two) 
LessSketchyDAO.java 
public class LessSketchyDAO extends BasicDAO<LessSketchyPojo> { 
@Inject 
public LessSketchyDAO(Datastore ds) { 
super(LessSketchyPojo.class, ds); 
} 
@PreSave 
public void preSave(LessSketchyPojo pojo, DBObject obj) { 
obj.put(“secret”, encryptWithSecret(pojo.secretKey, pojo.secret); 
} 
@PreLoad 
public void preLoad(DBObject obj) { 
try { 
obj.put(“secret”, decryptWithSecret(obj.get(“secretKey”), obj.get(“secret”)); 
} catch (EncryptionException e) {} 
} 
};
At-Rest Encryption (Take Two) 
Command Line 
> db.LessSketchyPojo.findOne() 
{ 
"_id": ObjectId("5445dd2b7830e8d4dff439d9"), 
"clientId": "Dr. No", 
"secretKey": "<BASE64-encoded byte string>", 
"secret": "APu5vPONiaLD4- 
ykkgG6gG7hlN7reB_XY3rqLGkQ5aBTZBXveUqH_jJwRSjNCMCjrT0rFSe0ZCyrUAxPvjzV 
idKs5JIbtvwX0SQqGmKf_853a-L_CkoyCRgJfPwzf81XM1dpGR8Kp9hMNAvkrdbco- 
GdZgE6HENRnXcLzmoYTVhUIhwSCi3rX_8w9_Wn_GVLGI3EF-s- 
0r7bqElxn0CB2l4W80sjDTlom_0nbZfwF92Xq9cctnnWghgLYaVEWxL3Va2tQL-BJtybcMiJd- 
DnxXjHxlRPRB4jtIP8eJMagW7hCh7aDEOC5s0SEiZs5fLRt-dExKgbwxjz" 
}
At-Rest Encryption (Take Two) 
LessSketchyDAO.java 
public class LessSketchyDAO extends BasicDAO<LessSketchyPojo> { 
@Inject 
public LessSketchyDAO(Datastore ds) { 
super(LessSketchyPojo.class, ds); 
} 
@PreSave 
public void preSave(LessSketchyPojo pojo, DBObject obj) { 
obj.put(“secret”, encryptWithSecret(pojo.secretKey, pojo.secret); 
} 
@PreLoad 
public void preLoad(DBObject obj) { 
try { 
obj.put(“secret”, decryptWithSecret(obj.get(“secretKey”), obj.get(“secret”)); 
} catch (EncryptionException e) {} 
} 
};
At-Rest Encryption (Take Three) 
HappyPojo.java 
public class HappyPojo { 
@EncryptionScope public String clientId; 
@EncryptAtRest public String secret; 
};
At-Rest Encryption (Take Three) 
Command Line 
> db.HappyPojo.findOne() 
{ 
"_id": ObjectId("5445dd2b7830e8d4dff439d9"), 
"clientId": "Dr. No", 
"secret": "APu5vPONiaLD4- 
ykkgG6gG7hlN7reB_XY3rqLGkQ5aBTZBXveUqH_jJwRSjNCMCjrT0rFSe0ZCyrUAxPvjzVidKs5JIbtvwX0SQqGmK 
f_853a-L_CkoyCRgJfPwzf81XM1dpGR8Kp9hMNAvkrdbco- 
GdZgE6HENRnXcLzmoYTVhUIhwSCi3rX_8w9_Wn_GVLGI3EF-s- 
0r7bqElxn0CB2l4W80sjDTlom_0nbZfwF92Xq9cctnnWghgLYaVEWxL3Va2tQL-BJtybcMiJd- 
DnxXjHxlRPRB4jtIP8eJMagW7hCh7aDEOC5s0SEiZs5fLRt-dExKgbwxjz" 
}
At-Rest Encryption (Take Three) 
Command Line 
> db.HappyPojo.findOne() 
{ 
"_id": ObjectId("5445dd2b7830e8d4dff439d9"), 
"clientId": "Dr. No", 
"secret": "APu5vPONiaLD4- 
ykkgG6gG7hlN7reB_XY3rqLGkQ5aBTZBXveUqH_jJwRSjNCMCjrT0rFSe0ZCyrUAxPvjzVidKs5JIbtvwX0SQqGmK 
f_853a-L_CkoyCRgJfPwzf81XM1dpGR8Kp9hMNAvkrdbco- 
GdZgE6HENRnXcLzmoYTVhUIhwSCi3rX_8w9_Wn_GVLGI3EF-s- 
0r7bqElxn0CB2l4W80sjDTlom_0nbZfwF92Xq9cctnnWghgLYaVEWxL3Va2tQL-BJtybcMiJd- 
DnxXjHxlRPRB4jtIP8eJMagW7hCh7aDEOC5s0SEiZs5fLRt-dExKgbwxjz" 
} 
> db.ScopedKeys.find({_id : "Dr. No"}) 
{ 
"_id": "Dr. No", 
"metadata": "{ < some JSON describing a Keyczar DECRYPT_AND_ENCRYPT keyring > }", 
"secrets": [ 
"0": "{"aesKeyString": "22mM-utDU_LSzhhwus3cuA","mode":"CBC","size":128}", 
"1": "{"aesKeyString": "22mM-utDU_LSzhhwus3cuA","mode":"CBC","size":128}" 
] 
}
At-Rest Encryption (Take Three) 
MongoModule.java 
public class MongoModule extends AbstractModule { 
@Provides 
public Morphia providesMorphia(CrypterFactory crypterFactory) { 
Morphia morphia = new Morphia(); 
... 
morphia.getMapper().addInterceptor( 
new EncryptAtRestInterceptor(crypterFactory)); 
return morphia; 
};
Encrypt-At-Rest like the boss 
Key Takeaways 
1. Don’t Repeat Yourself. 
2. Morphia’s lifecycle handling is incredibly useful, when used properly. 
3. Don’t Repeat Yourself! 
4. Encryption is a scary word, but we can make it as natural as annotating a POJO. 
5. Use OSS to DRY your code 
https://github.com/relateiq/EncryptAtRestInterceptor 
1. Pull requests appreciated!
The Oplog 
Golden Horde
Golden Horde 
Lifecycle Methods are Awesome 
● So why don’t we use it to ETL 
changes to the database for 
analytics and data warehousing? 
● Better, how about we transform 
documents and feed them back into 
the system!?
Golden Horde 
Lifecycle Methods are Awesome 
● So why don’t we use it to ETL 
changes to the database? 
Okay… awesome-”ish” 
● It only takes one guy with CLI 
access, or a buggy service.
Golden Horde 
Lifecycle Methods are Awesome 
● So why don’t we use it to ETL 
changes to the database? 
Okay… awesome-”ish” 
● It only takes one guy with CLI 
access, or a buggy service. 
Oplog to the rescue! 
● We can rely on the same system 
that Mongo uses internally for 
tracking and updating repls.
Golden Horde
Closing Arguments 
Golden Horde
Q & A 
Golden Horde

More Related Content

What's hot

支撐英雄聯盟戰績網的那條巨蟒
支撐英雄聯盟戰績網的那條巨蟒支撐英雄聯盟戰績網的那條巨蟒
支撐英雄聯盟戰績網的那條巨蟒Toki Kanno
 
Philipp Krenn | Make Your Data FABulous | Codemotion Madrid 2018
Philipp Krenn | Make Your Data FABulous | Codemotion Madrid 2018Philipp Krenn | Make Your Data FABulous | Codemotion Madrid 2018
Philipp Krenn | Make Your Data FABulous | Codemotion Madrid 2018Codemotion
 
Elasticsearch at Dailymotion
Elasticsearch at DailymotionElasticsearch at Dailymotion
Elasticsearch at DailymotionCédric Hourcade
 
Password Security
Password SecurityPassword Security
Password SecurityCSCJournals
 
Grokking Grok: Monitorama PDX 2015
Grokking Grok: Monitorama PDX 2015Grokking Grok: Monitorama PDX 2015
Grokking Grok: Monitorama PDX 2015GregMefford
 
OWASP AppSecCali 2015 - Marshalling Pickles
OWASP AppSecCali 2015 - Marshalling PicklesOWASP AppSecCali 2015 - Marshalling Pickles
OWASP AppSecCali 2015 - Marshalling PicklesChristopher Frohoff
 
The Art of JVM Profiling
The Art of JVM ProfilingThe Art of JVM Profiling
The Art of JVM ProfilingAndrei Pangin
 
MongoDB World 2016: Deciphering .explain() Output
MongoDB World 2016: Deciphering .explain() OutputMongoDB World 2016: Deciphering .explain() Output
MongoDB World 2016: Deciphering .explain() OutputMongoDB
 
Philipp Krenn "Make Your Data FABulous"
Philipp Krenn "Make Your Data FABulous"Philipp Krenn "Make Your Data FABulous"
Philipp Krenn "Make Your Data FABulous"Fwdays
 
Monitoring MongoDB (MongoSV)
Monitoring MongoDB (MongoSV)Monitoring MongoDB (MongoSV)
Monitoring MongoDB (MongoSV)Boxed Ice
 
Password (in)security
Password (in)securityPassword (in)security
Password (in)securityEnrico Zimuel
 
Search Evolution - Von Lucene zu Solr und ElasticSearch
Search Evolution - Von Lucene zu Solr und ElasticSearchSearch Evolution - Von Lucene zu Solr und ElasticSearch
Search Evolution - Von Lucene zu Solr und ElasticSearchFlorian Hopf
 
MongoDB Performance Tuning
MongoDB Performance TuningMongoDB Performance Tuning
MongoDB Performance TuningPuneet Behl
 
Bang-Bang, you have been hacked - Yonatan Levin, KolGene
Bang-Bang, you have been hacked - Yonatan Levin, KolGeneBang-Bang, you have been hacked - Yonatan Levin, KolGene
Bang-Bang, you have been hacked - Yonatan Levin, KolGeneDroidConTLV
 
ドキュメントデータベースとして MySQLを使う!? ~MySQL JSON UDF~
ドキュメントデータベースとして MySQLを使う!? ~MySQL JSON UDF~ドキュメントデータベースとして MySQLを使う!? ~MySQL JSON UDF~
ドキュメントデータベースとして MySQLを使う!? ~MySQL JSON UDF~yoyamasaki
 
0 to 31337 Real Quick: Lessons Learned by Reversing the Flare-On Challenge
0 to 31337 Real Quick: Lessons Learned by Reversing the Flare-On Challenge0 to 31337 Real Quick: Lessons Learned by Reversing the Flare-On Challenge
0 to 31337 Real Quick: Lessons Learned by Reversing the Flare-On ChallengeBlaine Stancill
 

What's hot (20)

Hack ASP.NET website
Hack ASP.NET websiteHack ASP.NET website
Hack ASP.NET website
 
支撐英雄聯盟戰績網的那條巨蟒
支撐英雄聯盟戰績網的那條巨蟒支撐英雄聯盟戰績網的那條巨蟒
支撐英雄聯盟戰績網的那條巨蟒
 
Philipp Krenn | Make Your Data FABulous | Codemotion Madrid 2018
Philipp Krenn | Make Your Data FABulous | Codemotion Madrid 2018Philipp Krenn | Make Your Data FABulous | Codemotion Madrid 2018
Philipp Krenn | Make Your Data FABulous | Codemotion Madrid 2018
 
Elasticsearch at Dailymotion
Elasticsearch at DailymotionElasticsearch at Dailymotion
Elasticsearch at Dailymotion
 
Password Security
Password SecurityPassword Security
Password Security
 
Grokking Grok: Monitorama PDX 2015
Grokking Grok: Monitorama PDX 2015Grokking Grok: Monitorama PDX 2015
Grokking Grok: Monitorama PDX 2015
 
OWASP AppSecCali 2015 - Marshalling Pickles
OWASP AppSecCali 2015 - Marshalling PicklesOWASP AppSecCali 2015 - Marshalling Pickles
OWASP AppSecCali 2015 - Marshalling Pickles
 
The Art of JVM Profiling
The Art of JVM ProfilingThe Art of JVM Profiling
The Art of JVM Profiling
 
Passwords presentation
Passwords presentationPasswords presentation
Passwords presentation
 
Elastic search 검색
Elastic search 검색Elastic search 검색
Elastic search 검색
 
MongoDB World 2016: Deciphering .explain() Output
MongoDB World 2016: Deciphering .explain() OutputMongoDB World 2016: Deciphering .explain() Output
MongoDB World 2016: Deciphering .explain() Output
 
Philipp Krenn "Make Your Data FABulous"
Philipp Krenn "Make Your Data FABulous"Philipp Krenn "Make Your Data FABulous"
Philipp Krenn "Make Your Data FABulous"
 
Monitoring MongoDB (MongoSV)
Monitoring MongoDB (MongoSV)Monitoring MongoDB (MongoSV)
Monitoring MongoDB (MongoSV)
 
Password (in)security
Password (in)securityPassword (in)security
Password (in)security
 
Search Evolution - Von Lucene zu Solr und ElasticSearch
Search Evolution - Von Lucene zu Solr und ElasticSearchSearch Evolution - Von Lucene zu Solr und ElasticSearch
Search Evolution - Von Lucene zu Solr und ElasticSearch
 
MongoDB Performance Tuning
MongoDB Performance TuningMongoDB Performance Tuning
MongoDB Performance Tuning
 
Bang-Bang, you have been hacked - Yonatan Levin, KolGene
Bang-Bang, you have been hacked - Yonatan Levin, KolGeneBang-Bang, you have been hacked - Yonatan Levin, KolGene
Bang-Bang, you have been hacked - Yonatan Levin, KolGene
 
ドキュメントデータベースとして MySQLを使う!? ~MySQL JSON UDF~
ドキュメントデータベースとして MySQLを使う!? ~MySQL JSON UDF~ドキュメントデータベースとして MySQLを使う!? ~MySQL JSON UDF~
ドキュメントデータベースとして MySQLを使う!? ~MySQL JSON UDF~
 
What's new in Liferay Mobile SDK 2.0 for Android
What's new in Liferay Mobile SDK 2.0 for AndroidWhat's new in Liferay Mobile SDK 2.0 for Android
What's new in Liferay Mobile SDK 2.0 for Android
 
0 to 31337 Real Quick: Lessons Learned by Reversing the Flare-On Challenge
0 to 31337 Real Quick: Lessons Learned by Reversing the Flare-On Challenge0 to 31337 Real Quick: Lessons Learned by Reversing the Flare-On Challenge
0 to 31337 Real Quick: Lessons Learned by Reversing the Flare-On Challenge
 

Similar to Hacking MongoDB at RelateIQ, A Salesforce Company

[C12]元気Hadoop! OracleをHadoopで分析しちゃうぜ by Daisuke Hirama
[C12]元気Hadoop! OracleをHadoopで分析しちゃうぜ by Daisuke Hirama[C12]元気Hadoop! OracleをHadoopで分析しちゃうぜ by Daisuke Hirama
[C12]元気Hadoop! OracleをHadoopで分析しちゃうぜ by Daisuke HiramaInsight Technology, Inc.
 
Appsec usa2013 js_libinsecurity_stefanodipaola
Appsec usa2013 js_libinsecurity_stefanodipaolaAppsec usa2013 js_libinsecurity_stefanodipaola
Appsec usa2013 js_libinsecurity_stefanodipaoladrewz lin
 
JSLT: JSON querying and transformation
JSLT: JSON querying and transformationJSLT: JSON querying and transformation
JSLT: JSON querying and transformationLars Marius Garshol
 
ORM in Go. Internals, tips & tricks
ORM in Go. Internals, tips & tricksORM in Go. Internals, tips & tricks
ORM in Go. Internals, tips & tricksDmytro Istratkin
 
Ts archiving
Ts   archivingTs   archiving
Ts archivingConfiz
 
DevOps Fest 2019. Сергей Марченко. Terraform: a novel about modules, provider...
DevOps Fest 2019. Сергей Марченко. Terraform: a novel about modules, provider...DevOps Fest 2019. Сергей Марченко. Terraform: a novel about modules, provider...
DevOps Fest 2019. Сергей Марченко. Terraform: a novel about modules, provider...DevOps_Fest
 
NoSQL Endgame LWJUG 2021
NoSQL Endgame LWJUG 2021NoSQL Endgame LWJUG 2021
NoSQL Endgame LWJUG 2021Thodoris Bais
 
REST with Eve and Python
REST with Eve and PythonREST with Eve and Python
REST with Eve and PythonPiXeL16
 
Fast as C: How to Write Really Terrible Java
Fast as C: How to Write Really Terrible JavaFast as C: How to Write Really Terrible Java
Fast as C: How to Write Really Terrible JavaCharles Nutter
 
marko_go_in_badoo
marko_go_in_badoomarko_go_in_badoo
marko_go_in_badooMarko Kevac
 
Crystal & Kemal: Simply Fast
Crystal & Kemal: Simply FastCrystal & Kemal: Simply Fast
Crystal & Kemal: Simply FastSerdar Dogruyol
 
ActiveJDBC - ActiveRecord implementation in Java
ActiveJDBC - ActiveRecord implementation in JavaActiveJDBC - ActiveRecord implementation in Java
ActiveJDBC - ActiveRecord implementation in Javaipolevoy
 
Questioning the status quo
Questioning the status quoQuestioning the status quo
Questioning the status quoIvano Pagano
 
Attack monitoring using ElasticSearch Logstash and Kibana
Attack monitoring using ElasticSearch Logstash and KibanaAttack monitoring using ElasticSearch Logstash and Kibana
Attack monitoring using ElasticSearch Logstash and KibanaPrajal Kulkarni
 
Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)Damien Seguy
 
Jsonsaga 100605143125-phpapp02
Jsonsaga 100605143125-phpapp02Jsonsaga 100605143125-phpapp02
Jsonsaga 100605143125-phpapp02Ramamohan Chokkam
 
[CB20] Vulnerabilities of Machine Learning Infrastructure by Sergey Gordeychik
[CB20] Vulnerabilities of Machine Learning Infrastructure by Sergey Gordeychik[CB20] Vulnerabilities of Machine Learning Infrastructure by Sergey Gordeychik
[CB20] Vulnerabilities of Machine Learning Infrastructure by Sergey GordeychikCODE BLUE
 

Similar to Hacking MongoDB at RelateIQ, A Salesforce Company (20)

[C12]元気Hadoop! OracleをHadoopで分析しちゃうぜ by Daisuke Hirama
[C12]元気Hadoop! OracleをHadoopで分析しちゃうぜ by Daisuke Hirama[C12]元気Hadoop! OracleをHadoopで分析しちゃうぜ by Daisuke Hirama
[C12]元気Hadoop! OracleをHadoopで分析しちゃうぜ by Daisuke Hirama
 
Appsec usa2013 js_libinsecurity_stefanodipaola
Appsec usa2013 js_libinsecurity_stefanodipaolaAppsec usa2013 js_libinsecurity_stefanodipaola
Appsec usa2013 js_libinsecurity_stefanodipaola
 
JWTs and JOSE in a flash
JWTs and JOSE in a flashJWTs and JOSE in a flash
JWTs and JOSE in a flash
 
JSLT: JSON querying and transformation
JSLT: JSON querying and transformationJSLT: JSON querying and transformation
JSLT: JSON querying and transformation
 
ORM in Go. Internals, tips & tricks
ORM in Go. Internals, tips & tricksORM in Go. Internals, tips & tricks
ORM in Go. Internals, tips & tricks
 
Ts archiving
Ts   archivingTs   archiving
Ts archiving
 
DevOps Fest 2019. Сергей Марченко. Terraform: a novel about modules, provider...
DevOps Fest 2019. Сергей Марченко. Terraform: a novel about modules, provider...DevOps Fest 2019. Сергей Марченко. Terraform: a novel about modules, provider...
DevOps Fest 2019. Сергей Марченко. Terraform: a novel about modules, provider...
 
NoSQL Endgame LWJUG 2021
NoSQL Endgame LWJUG 2021NoSQL Endgame LWJUG 2021
NoSQL Endgame LWJUG 2021
 
REST with Eve and Python
REST with Eve and PythonREST with Eve and Python
REST with Eve and Python
 
Fast as C: How to Write Really Terrible Java
Fast as C: How to Write Really Terrible JavaFast as C: How to Write Really Terrible Java
Fast as C: How to Write Really Terrible Java
 
Django cryptography
Django cryptographyDjango cryptography
Django cryptography
 
marko_go_in_badoo
marko_go_in_badoomarko_go_in_badoo
marko_go_in_badoo
 
Crystal & Kemal: Simply Fast
Crystal & Kemal: Simply FastCrystal & Kemal: Simply Fast
Crystal & Kemal: Simply Fast
 
ActiveJDBC - ActiveRecord implementation in Java
ActiveJDBC - ActiveRecord implementation in JavaActiveJDBC - ActiveRecord implementation in Java
ActiveJDBC - ActiveRecord implementation in Java
 
Questioning the status quo
Questioning the status quoQuestioning the status quo
Questioning the status quo
 
Attack monitoring using ElasticSearch Logstash and Kibana
Attack monitoring using ElasticSearch Logstash and KibanaAttack monitoring using ElasticSearch Logstash and Kibana
Attack monitoring using ElasticSearch Logstash and Kibana
 
Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)
 
Jsonsaga 100605143125-phpapp02
Jsonsaga 100605143125-phpapp02Jsonsaga 100605143125-phpapp02
Jsonsaga 100605143125-phpapp02
 
[CB20] Vulnerabilities of Machine Learning Infrastructure by Sergey Gordeychik
[CB20] Vulnerabilities of Machine Learning Infrastructure by Sergey Gordeychik[CB20] Vulnerabilities of Machine Learning Infrastructure by Sergey Gordeychik
[CB20] Vulnerabilities of Machine Learning Infrastructure by Sergey Gordeychik
 
ZODB Tips and Tricks
ZODB Tips and TricksZODB Tips and Tricks
ZODB Tips and Tricks
 

More from MongoDB

MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB
 
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB
 
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB
 
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB
 
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB
 
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB
 
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 MongoDB SoCal 2020: MongoDB Atlas Jump Start MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB SoCal 2020: MongoDB Atlas Jump StartMongoDB
 
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB
 
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB
 
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB
 
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB
 
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB
 
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB
 
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB
 
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB
 
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB
 
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB
 
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB
 
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB
 
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB
 

More from MongoDB (20)

MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
 
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
 
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
 
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
 
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
 
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
 
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 MongoDB SoCal 2020: MongoDB Atlas Jump Start MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
 
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
 
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
 
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
 
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
 
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
 
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
 
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
 
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
 
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
 
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
 
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
 
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
 

Recently uploaded

Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 

Recently uploaded (20)

Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 

Hacking MongoDB at RelateIQ, A Salesforce Company

  • 1. Title of slide to go here RelateIQ @ MongoSF
  • 2. RelateIQ @ MongoSF Blog blog.relateiq.com RelateIQ Twitter @relateiq { name: “Jón Tómas Grétarsson”, pretty_description: “Early Engineer”, email: “jon@relateiq.com”, twitter: @jontomas }
  • 3. 1. MongoDB at RelateIQ 2. Encryption at Rest 3. Golden Horde (Oplog) 4.Q&A Agenda
  • 4. MongoDB usage at RelateIQ Our stack ● Multiple consumers ● Distributed services ● Batch and stream processing We speak JSON ● Cross-language compatibility ● Engineer-debuggable ● Easy to test! MongoDB ● Strong Java support via morphia o Lifecycle methods!
  • 6. At-Rest Encryption @preLoad Called before mapping the datastore object to the entity (POJO); the DBObject is passed as an argument (you can add/remove/change values) You have ● The DBObject ● A class definition (reflection!) You don’t have ● That POJO with all the convenience methods @preSave Called right before DBCollection.save() is called. Changes made to the entity (POJO) will not be persisted; the DBObject can be passed as an argument (you can add/remove/change values) You have ● The original POJO, including class definitions and convenience methods
  • 7. At-Rest Encryption SadPojo.java public class SadPojo { public String clientId; public String secret; }; SadDAO.java public class SadDAO extends BasicDAO<SadPojo> { @Inject public SadDAO(Datastore ds) { super(SadPojo.class, ds); } };
  • 8. At-Rest Encryption Command Line > db.SadPojo.findOne() { "_id": ObjectId("5445dd2b7830e8d4dff439d9"), "clientId": "Dr. No", "secret": "What follows are my evil plans to take over the world..." }
  • 9. SketchyPojo.java public class SketchyPojo { public String clientId; public String secretKey; public String secret; @PreSave public void preSave(DBObject obj) { obj.put(“secret”, encryptWithSecret(secretKey, secret); } @PreLoad public void preLoad(DBObject obj) { try { obj.put(“secret”, decryptWithSecret(obj.get(“secretKey”), obj.get(“secret”)); } catch (EncryptionException e) {} } }; At-Rest Encryption (Take One)
  • 10. At-Rest Encryption (Take One) Command Line > db.SketchyPojo.findOne() { "_id": ObjectId("5445dd2b7830e8d4dff439d9"), "clientId": "Dr. No", "secretKey": "<BASE64-encoded byte string>", "secret": "APu5vPONiaLD4- ykkgG6gG7hlN7reB_XY3rqLGkQ5aBTZBXveUqH_jJwRSjNCMCjrT0rFSe0ZCyrUAxPvjzV idKs5JIbtvwX0SQqGmKf_853a-L_CkoyCRgJfPwzf81XM1dpGR8Kp9hMNAvkrdbco- GdZgE6HENRnXcLzmoYTVhUIhwSCi3rX_8w9_Wn_GVLGI3EF-s- 0r7bqElxn0CB2l4W80sjDTlom_0nbZfwF92Xq9cctnnWghgLYaVEWxL3Va2tQL-BJtybcMiJd- DnxXjHxlRPRB4jtIP8eJMagW7hCh7aDEOC5s0SEiZs5fLRt-dExKgbwxjz" }
  • 11. SketchyPojo.java public class SketchyPojo { public String clientId; public String secretKey; public String secret; @PreSave public void preSave(DBObject obj) { obj.put(“secret”, encryptWithSecret(secretKey, secret); } @PreLoad public void preLoad(DBObject obj) { try { obj.put(“secret”, decryptWithSecret(obj.get(“secretKey”), obj.get(“secret”)); } catch (EncryptionException e) {} } }; At-Rest Encryption (Take One)
  • 12. At-Rest Encryption (Take Two) LessSketchyDAO.java public class LessSketchyDAO extends BasicDAO<LessSketchyPojo> { @Inject public LessSketchyDAO(Datastore ds) { super(LessSketchyPojo.class, ds); } @PreSave public void preSave(LessSketchyPojo pojo, DBObject obj) { obj.put(“secret”, encryptWithSecret(pojo.secretKey, pojo.secret); } @PreLoad public void preLoad(DBObject obj) { try { obj.put(“secret”, decryptWithSecret(obj.get(“secretKey”), obj.get(“secret”)); } catch (EncryptionException e) {} } };
  • 13. At-Rest Encryption (Take Two) Command Line > db.LessSketchyPojo.findOne() { "_id": ObjectId("5445dd2b7830e8d4dff439d9"), "clientId": "Dr. No", "secretKey": "<BASE64-encoded byte string>", "secret": "APu5vPONiaLD4- ykkgG6gG7hlN7reB_XY3rqLGkQ5aBTZBXveUqH_jJwRSjNCMCjrT0rFSe0ZCyrUAxPvjzV idKs5JIbtvwX0SQqGmKf_853a-L_CkoyCRgJfPwzf81XM1dpGR8Kp9hMNAvkrdbco- GdZgE6HENRnXcLzmoYTVhUIhwSCi3rX_8w9_Wn_GVLGI3EF-s- 0r7bqElxn0CB2l4W80sjDTlom_0nbZfwF92Xq9cctnnWghgLYaVEWxL3Va2tQL-BJtybcMiJd- DnxXjHxlRPRB4jtIP8eJMagW7hCh7aDEOC5s0SEiZs5fLRt-dExKgbwxjz" }
  • 14. At-Rest Encryption (Take Two) LessSketchyDAO.java public class LessSketchyDAO extends BasicDAO<LessSketchyPojo> { @Inject public LessSketchyDAO(Datastore ds) { super(LessSketchyPojo.class, ds); } @PreSave public void preSave(LessSketchyPojo pojo, DBObject obj) { obj.put(“secret”, encryptWithSecret(pojo.secretKey, pojo.secret); } @PreLoad public void preLoad(DBObject obj) { try { obj.put(“secret”, decryptWithSecret(obj.get(“secretKey”), obj.get(“secret”)); } catch (EncryptionException e) {} } };
  • 15. At-Rest Encryption (Take Three) HappyPojo.java public class HappyPojo { @EncryptionScope public String clientId; @EncryptAtRest public String secret; };
  • 16. At-Rest Encryption (Take Three) Command Line > db.HappyPojo.findOne() { "_id": ObjectId("5445dd2b7830e8d4dff439d9"), "clientId": "Dr. No", "secret": "APu5vPONiaLD4- ykkgG6gG7hlN7reB_XY3rqLGkQ5aBTZBXveUqH_jJwRSjNCMCjrT0rFSe0ZCyrUAxPvjzVidKs5JIbtvwX0SQqGmK f_853a-L_CkoyCRgJfPwzf81XM1dpGR8Kp9hMNAvkrdbco- GdZgE6HENRnXcLzmoYTVhUIhwSCi3rX_8w9_Wn_GVLGI3EF-s- 0r7bqElxn0CB2l4W80sjDTlom_0nbZfwF92Xq9cctnnWghgLYaVEWxL3Va2tQL-BJtybcMiJd- DnxXjHxlRPRB4jtIP8eJMagW7hCh7aDEOC5s0SEiZs5fLRt-dExKgbwxjz" }
  • 17. At-Rest Encryption (Take Three) Command Line > db.HappyPojo.findOne() { "_id": ObjectId("5445dd2b7830e8d4dff439d9"), "clientId": "Dr. No", "secret": "APu5vPONiaLD4- ykkgG6gG7hlN7reB_XY3rqLGkQ5aBTZBXveUqH_jJwRSjNCMCjrT0rFSe0ZCyrUAxPvjzVidKs5JIbtvwX0SQqGmK f_853a-L_CkoyCRgJfPwzf81XM1dpGR8Kp9hMNAvkrdbco- GdZgE6HENRnXcLzmoYTVhUIhwSCi3rX_8w9_Wn_GVLGI3EF-s- 0r7bqElxn0CB2l4W80sjDTlom_0nbZfwF92Xq9cctnnWghgLYaVEWxL3Va2tQL-BJtybcMiJd- DnxXjHxlRPRB4jtIP8eJMagW7hCh7aDEOC5s0SEiZs5fLRt-dExKgbwxjz" } > db.ScopedKeys.find({_id : "Dr. No"}) { "_id": "Dr. No", "metadata": "{ < some JSON describing a Keyczar DECRYPT_AND_ENCRYPT keyring > }", "secrets": [ "0": "{"aesKeyString": "22mM-utDU_LSzhhwus3cuA","mode":"CBC","size":128}", "1": "{"aesKeyString": "22mM-utDU_LSzhhwus3cuA","mode":"CBC","size":128}" ] }
  • 18. At-Rest Encryption (Take Three) MongoModule.java public class MongoModule extends AbstractModule { @Provides public Morphia providesMorphia(CrypterFactory crypterFactory) { Morphia morphia = new Morphia(); ... morphia.getMapper().addInterceptor( new EncryptAtRestInterceptor(crypterFactory)); return morphia; };
  • 19. Encrypt-At-Rest like the boss Key Takeaways 1. Don’t Repeat Yourself. 2. Morphia’s lifecycle handling is incredibly useful, when used properly. 3. Don’t Repeat Yourself! 4. Encryption is a scary word, but we can make it as natural as annotating a POJO. 5. Use OSS to DRY your code https://github.com/relateiq/EncryptAtRestInterceptor 1. Pull requests appreciated!
  • 21. Golden Horde Lifecycle Methods are Awesome ● So why don’t we use it to ETL changes to the database for analytics and data warehousing? ● Better, how about we transform documents and feed them back into the system!?
  • 22. Golden Horde Lifecycle Methods are Awesome ● So why don’t we use it to ETL changes to the database? Okay… awesome-”ish” ● It only takes one guy with CLI access, or a buggy service.
  • 23. Golden Horde Lifecycle Methods are Awesome ● So why don’t we use it to ETL changes to the database? Okay… awesome-”ish” ● It only takes one guy with CLI access, or a buggy service. Oplog to the rescue! ● We can rely on the same system that Mongo uses internally for tracking and updating repls.
  • 26. Q & A Golden Horde

Editor's Notes

  1. Who We Are I’m a DevOps guys these days, and my passion is turning engineering productivity up to 11. Core part of RelateIQ culture is the Hack Day, and I thought I would take this opportunity to talk to you about some of the mongo-specific projects that I’ve had the privilege of working on over the last couple of years.
  2. Don’t need to sell MongoDB!
  3. Asynchronous deployment cycles for iOS, Android, Web and API requires a common communication A persistent queue like kafka requires that messages be “backwards compatible” to withstand deployments
  4. Asynchronous deployment cycles for iOS, Android, Web and API requires a common communication A persistent queue like kafka requires that messages be “backwards compatible” to withstand deployments, and
  5. Asynchronous deployment cycles for iOS, Android, Web and API requires a common communication A persistent queue like kafka requires that messages be “backwards compatible” to withstand deployments, and
  6. Asynchronous deployment cycles for iOS, Android, Web and API requires a common communication A persistent queue like kafka requires that messages be “backwards compatible” to withstand deployments, and
  7. Lots of DRY code, tricky to remember, need to remember the *actual* DBObject key for every encrypted value
  8. Lots of DRY code, tricky to remember, need to remember the *actual* DBObject key for every encrypted value
  9. Lots of DRY code, tricky to remember, need to remember the *actual* DBObject key for every encrypted value
  10. Lots of DRY code, tricky to remember, need to remember the *actual* DBObject key for every encrypted value
  11. Lots of DRY code, tricky to remember, need to remember the *actual* DBObject key for every encrypted value
  12. Lots of DRY code, tricky to remember, need to remember the *actual* DBObject key for every encrypted value
  13. Asynchronous deployment cycles for iOS, Android, Web and API requires a common communication A persistent queue like kafka requires that messages be “backwards compatible” to withstand deployments, and OSS EncryptAtRest
  14. Asynchronous deployment cycles for iOS, Android, Web and API requires a common communication A persistent queue like kafka requires that messages be “backwards compatible” to withstand deployments, and OSS EncryptAtRest
  15. Asynchronous deployment cycles for iOS, Android, Web and API requires a common communication A persistent queue like kafka requires that messages be “backwards compatible” to withstand deployments, and OSS EncryptAtRest
  16. Asynchronous deployment cycles for iOS, Android, Web and API requires a common communication A persistent queue like kafka requires that messages be “backwards compatible” to withstand deployments, and
  17. Asynchronous deployment cycles for iOS, Android, Web and API requires a common communication A persistent queue like kafka requires that messages be “backwards compatible” to withstand deployments
  18. Asynchronous deployment cycles for iOS, Android, Web and API requires a common communication A persistent queue like kafka requires that messages be “backwards compatible” to withstand deployments
  19. Asynchronous deployment cycles for iOS, Android, Web and API requires a common communication A persistent queue like kafka requires that messages be “backwards compatible” to withstand deployments
  20. Evolution in thinking-style presentation. Application-level code failed to capture developers changing things from the command line Hack Day —> Iteration One —> Kafka —> Awesome-sauce
  21. There were some bumps along the road, but we stuck with it and it was totally worth it. Bumps in the road Document-level locking (finally!) Write-consistency quorum
  22. 7 minutes!